OrderedDict vs defaultdict vs dict [关闭]

2023-12-01

在 python 的库中,我们现在有两个字典的 Python 实现,它们是子类dict超越本地人dict type.

Python 的拥护者一直更喜欢defaultdict过度使用dict.setdefault在可能的情况。即便是doc引用This technique is simpler and faster than an equivalent technique using dict.setdefault():

以类似的方式,由于字典不维护顺序,因此使用OrderedDict过度使用dict如果可能的话,最好先对项目进行排序,以供其他用途使用。

在上述两种情况下,代码肯定更干净,但代价是性能损失。

在回答和评论其中一个问题时python 基于项目的唯一列表,我偶然发现了相对于原生的性能损失dict使用时defaultdict and OrderedDict。数据的大小似乎对性能优势也并不重要dict解决方案已经超过其他。

我相信There should be one-- and preferably only one --obvious way to do it.,那么首选方式是什么?


没有一个单一的答案,也没有一个真实且唯一的命令。在许多变量中,它取决于:

  1. 数据集的大小;
  2. 数据映射集中唯一键的数量与重复键的数量;
  3. defaultdict底层工厂的速度;
  4. OrderedDict 的速度与稍后的排序步骤的比较;
  5. Python 的版本。

I am loathe概括地说,但这里有一些一般性:

  1. 该声明This technique is simpler and faster than an equivalent technique using dict.setdefault()完全错误。这取决于数据;
  2. setdefault对于小数据集更快、更简单;
  3. defaultdict对于具有更多同质键集的较大数据集更快(即添加元素后字典有多短);
  4. setdefault拥有更多异构密钥集的优势;
  5. Python 3 与 Python 2 的这些结果是不同的;
  6. OrderedDict除了依赖于顺序且顺序不易重构或排序的算法之外,在所有情况下都较慢;
  7. 对于大多数人来说,Python 3 通常更快dict运营;
  8. Python 3.6 的 dict 现在按插入顺序排序(减少了有用性OrderedDict).

唯一的事实是:这取决于!这三种技术都很有用。

这是一些要显示的计时代码:

from __future__ import print_function
from collections import defaultdict
from collections import OrderedDict

try:
    t=unichr(100)
except NameError:
    unichr=chr

def f1(li):
    '''defaultdict'''
    d = defaultdict(list)
    for k, v in li:
        d[k].append(v)
    return d.items()

def f2(li):
    '''setdefault'''
    d={}
    for k, v in li:
        d.setdefault(k, []).append(v)
    return d.items()

def f3(li):
    '''OrderedDict'''
    d=OrderedDict()
    for k, v in li:
        d.setdefault(k, []).append(v)
    return d.items()      


if __name__ == '__main__':
    import timeit
    import sys
    print(sys.version)
    few=[('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
    fmt='{:>12}: {:10.2f} micro sec/call ({:,} elements, {:,} keys)'
    for tag, m, n in [('small',5,10000), ('medium',20,1000), ('bigger',1000,100), ('large',5000,10)]:
        for f in [f1,f2,f3]:
            s = few*m
            res=timeit.timeit("{}(s)".format(f.__name__), setup="from __main__ import {}, s".format(f.__name__), number=n)
            st=fmt.format(f.__doc__, res/n*1000000, len(s), len(f(s)))
            print(st)
            s = [(unichr(i%0x10000),i) for i in range(1,len(s)+1)]
            res=timeit.timeit("{}(s)".format(f.__name__), setup="from __main__ import {}, s".format(f.__name__), number=n)
            st=fmt.format(f.__doc__, res/n*1000000, len(s), len(f(s)))
            print(st)            
        print() 

Python 2.7 结果:

2.7.5 (default, Aug 25 2013, 00:04:04) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]
 defaultdict:      10.20 micro sec/call (25 elements, 3 keys)
 defaultdict:      21.08 micro sec/call (25 elements, 25 keys)
  setdefault:      13.41 micro sec/call (25 elements, 3 keys)
  setdefault:      18.24 micro sec/call (25 elements, 25 keys)
 OrderedDict:      49.47 micro sec/call (25 elements, 3 keys)
 OrderedDict:     102.16 micro sec/call (25 elements, 25 keys)

 defaultdict:      28.28 micro sec/call (100 elements, 3 keys)
 defaultdict:      79.78 micro sec/call (100 elements, 100 keys)
  setdefault:      45.68 micro sec/call (100 elements, 3 keys)
  setdefault:      68.66 micro sec/call (100 elements, 100 keys)
 OrderedDict:     117.78 micro sec/call (100 elements, 3 keys)
 OrderedDict:     343.17 micro sec/call (100 elements, 100 keys)

 defaultdict:    1123.60 micro sec/call (5,000 elements, 3 keys)
 defaultdict:    4250.44 micro sec/call (5,000 elements, 5,000 keys)
  setdefault:    2089.86 micro sec/call (5,000 elements, 3 keys)
  setdefault:    3803.03 micro sec/call (5,000 elements, 5,000 keys)
 OrderedDict:    4399.16 micro sec/call (5,000 elements, 3 keys)
 OrderedDict:   16279.14 micro sec/call (5,000 elements, 5,000 keys)

 defaultdict:    5609.39 micro sec/call (25,000 elements, 3 keys)
 defaultdict:   25351.60 micro sec/call (25,000 elements, 25,000 keys)
  setdefault:   10267.00 micro sec/call (25,000 elements, 3 keys)
  setdefault:   24091.51 micro sec/call (25,000 elements, 25,000 keys)
 OrderedDict:   22091.98 micro sec/call (25,000 elements, 3 keys)
 OrderedDict:   94028.00 micro sec/call (25,000 elements, 25,000 keys)

Python 3.3 结果:

3.3.2 (default, May 21 2013, 11:50:47) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))]
 defaultdict:       8.58 micro sec/call (25 elements, 3 keys)
 defaultdict:      21.18 micro sec/call (25 elements, 25 keys)
  setdefault:      10.42 micro sec/call (25 elements, 3 keys)
  setdefault:      14.58 micro sec/call (25 elements, 25 keys)
 OrderedDict:      45.43 micro sec/call (25 elements, 3 keys)
 OrderedDict:      92.69 micro sec/call (25 elements, 25 keys)

 defaultdict:      20.47 micro sec/call (100 elements, 3 keys)
 defaultdict:      77.48 micro sec/call (100 elements, 100 keys)
  setdefault:      34.22 micro sec/call (100 elements, 3 keys)
  setdefault:      54.86 micro sec/call (100 elements, 100 keys)
 OrderedDict:     107.37 micro sec/call (100 elements, 3 keys)
 OrderedDict:     318.98 micro sec/call (100 elements, 100 keys)

 defaultdict:     714.70 micro sec/call (5,000 elements, 3 keys)
 defaultdict:    3892.92 micro sec/call (5,000 elements, 5,000 keys)
  setdefault:    1502.91 micro sec/call (5,000 elements, 3 keys)
  setdefault:    2888.08 micro sec/call (5,000 elements, 5,000 keys)
 OrderedDict:    3912.95 micro sec/call (5,000 elements, 3 keys)
 OrderedDict:   14863.02 micro sec/call (5,000 elements, 5,000 keys)

 defaultdict:    3649.02 micro sec/call (25,000 elements, 3 keys)
 defaultdict:   22313.17 micro sec/call (25,000 elements, 25,000 keys)
  setdefault:    7447.28 micro sec/call (25,000 elements, 3 keys)
  setdefault:   18426.88 micro sec/call (25,000 elements, 25,000 keys)
 OrderedDict:   19202.17 micro sec/call (25,000 elements, 3 keys)
 OrderedDict:   85946.45 micro sec/call (25,000 elements, 25,000 keys)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OrderedDict vs defaultdict vs dict [关闭] 的相关文章

随机推荐

  • 跨类型转换维护计量单位

    如果我们定义一个测量单位 例如
  • Android:查找内存泄漏的工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有没有一些有用的工具可以检测 Android Java 应用程序中的内存泄漏 类似于 Valgrind 的东西 其中显示了非释放对象的创建位置 看这
  • 在 Liferay 6.2 中使用 Bootstrap 3.3.6

    我正在 Liferay 6 2 中使用 Bootstrap 3 我在CSS和JS中插入了bootstrap css和bootstrap min js 我还更改了 custom css 中的一些样式 incompatilibilidad 你对
  • 如何更改面板的 BorderStyle?

    我有一个面板System Windows Forms Panel 有财产 BorderStyle FixedSingle 它以灰色边框渲染 I need 如果可能的话 能够设置边框的颜色和厚度 我很想知道是否也可以完全隐藏边界 知道如何解决
  • 使用 scikit-image 和 RANSAC 稳健估计多项式几何变换

    我想用 scikit image skimage transform 和 skimage measure ransac 稳健地估计多项式几何变换 ransack 文档提供了一个非常好的示例 说明如何通过相似性变换来实现这一点 事情是这样的
  • 需要特定字符串作为 TypeScript 界面中的可选键

    我遇到过这样的情况 我可以将许多可选的 T 恤大小的道具添加到一个对象中 有没有办法定义一个类型并将其设置为接口中可选键的类型 type Size xxs xs s m l xl xxl interface Sizes key Size s
  • matlab中如何读取文件夹中的图像

    我有六个这样的文件夹 gt gt Images每个文件夹都包含一些图像 我知道如何在 matlab 中读取图像 但我的问题是如何遍历这些文件夹并读取 abc m 文件中的图像 此文件显示在image 所以基本上你想读取不同文件夹中的图像 而
  • 如果字符超过一定限制,如何修剪元素的内容并添加“...”?

    我想修剪一部分 td 如果太长 这将确保桌子不会弄乱 下表中的所有数据均从数据库中检索 在 主题 部分 如果文本超过一定的字符限制 如何缩短文本并添加 这是该表的屏幕截图 正如您所看到的 如果主题太长 可能会弄乱表格 是否有任何 jQuer
  • 自定义寻呼机模板

    默认分页器机制在最后一行插入一个表格 然后该表格包含一行 其中包含所需数量的包含页码的单元格 我将页面模式设置为数字 我不想创建一个嵌套表格 而是创建一个由小方形 div 组成的分页模板 这些小方形 div 浮动在彼此的左侧 每个框中都有页
  • Swift 3 核心数据删除对象

    不幸的是 新的核心数据语义让我发疯 我之前的问题有一个干净的代码 但由于头文件的自动生成不正确而无法工作 现在我继续删除对象的工作 我的代码看起来很简单 func deleteProfile withID Int let fetchRequ
  • 不区分大小写的搜索并用 sed 替换

    我正在尝试使用 SED 从日志文件中提取文本 我可以毫不费力地进行搜索和替换 sed s foo bar mylog txt 但是 我想让搜索不区分大小写 从我用谷歌搜索到的内容来看 它看起来像是附加i到命令结束应该有效 sed s foo
  • 拆分包含音频的 CMSampleBufferRef

    我在录制时将录音分成不同的文件 问题是 captureOutput 视频和音频样本缓冲区不对应 1 1 这是合乎逻辑的 void captureOutput AVCaptureOutput captureOutput didOutputSa
  • 如何在div悬停时隐藏视频?

    我试图在 div 悬停时隐藏视频 但我似乎无法使其工作 目前 live video 类位于顶部 eat video 位于下方 我想在悬停 video hover 类时隐藏 live video 的显示 我想要实现的是 2 个全屏视频堆叠在一
  • 解析不同的日期格式:正则表达式

    重新发布这个问题并附上具体细节 因为最后一个问题已被标记下来 我正在努力从档案卡中解析混乱的 tesseract ocr 以获取至少 50 的信息 date1 数据行包含不同形式的日期 如下面的数据示例所示 Raw Text 1 15957
  • 使用 .bat 文件从 .xls 文件读取值

    我只是想知道是否有任何方法可以使用 bat 文件从 xls 文件中读取值 例如 如果我有一个名为 test xls 的 xls 它有两列 即 EID 然后是 邮件 ID 现在 当我们向 xls 输入 EID 名称时 它应该提取与 EID 相
  • 文本框的数据绑定

    我有一个存储 Fruit 类型的对象的基本属性 Fruit food public Fruit Food get return this food set this food value this RefreshDataBindings p
  • 尝试运行“ionic cordova run --emulator”时,在 com.android.prefs.AndroidLocation.getAvdFolder() 上出现 NoSuchMethodError 异常

    我刚刚升级了我的 cordova 和 ionic npm update g cordova ionic 现在当我运行 ionic cordova run emulator 时 我收到以下错误消息 线程 main 中出现异常 java lan
  • 使用jquery从html页面中删除样式标签

    有什么办法可以删除
  • Python unicode popen 或 Popen 读取 unicode 时出错

    我有一个程序可以生成以下输出 10 day weather forecast Tonight Sep 27 Clear 54 0 Tue Sep 28 Sunny 85 61 0 Wed Sep 29 Sunny 86 62 0 Thu S
  • OrderedDict vs defaultdict vs dict [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 python 的库中 我们现在有两个字典的 Python 实现 它们是子类dict超越本地人dict type Python 的拥护者一直更喜欢defaultdict过度使用dict