python - 更新字典整数成员时避免双重查找

标签 python performance dictionary python-2.6

如果字典包含您可以引用的内容,您可以通过一次字典查找来默认或更新它:

d.setdefault('k', []).append(2)

但是,如果它们是数字,则不可能以相同的方式修改字典条目:

d.setdefault('k', 0) += 1  # doesn't work

相反,您需要进行两次字典查找,一次用于读取,一次用于写入:

d['a'] = d.get('a', 0) + 1

对于具有大量键的字典来说,这似乎不是一个好主意。那么,有没有办法对包含数字的字典执行默认或更新操作?或者,换句话说,对此类词典应用默认或更新操作的最高效方法是什么?

最佳答案

快速测试表明 collections.defaultdict比你的双重查找快 2.5 倍(在 Python 2.6 上测试):

>>> import timeit
>>> s1 = "d = dict((str(n), 0) for n in range(1000000))"
>>> timeit.repeat("d['a'] = d.get('a', 0) + 1", setup=s1)
[0.17711305618286133, 0.17411494255065918, 0.17812514305114746]
>>> s2 = """
... from collections import defaultdict
... d = defaultdict(int, ((str(n), 0) for n in range(1000000)))
... """
>>> timeit.repeat("d['a'] += 1", setup=s2)
[0.07185506820678711, 0.07294416427612305, 0.12155508995056152]

关于python - 更新字典整数成员时避免双重查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25675520/

相关文章:

python - 修改纸条管道中的JSON

json - Python 3 json.load() 以错误的顺序读取 JSON 文件

python - 基于正则表达式拆分python列表

python - Django-Rest-Framework JWT 单元测试说 "No Authentication Provided"

python - 图像未加载到 flask 中的 HTML 模板上

windows - Delphi 应用程序与偶尔崩溃的程序通信 - 供应商指责我的 Delphi 应用程序

python - 忽略指定值的 numpy 数组的平均值

c++ - 使用 ISPC 编译器编译 OpenMP 程序

python - 使用 all() 比较字典中的值的多行 if 语句

python - 我怎样才能绕过 Keras pad_sequences() 将浮点值四舍五入为零?