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

时间:2014-09-04 21:50:27

标签: python performance dictionary python-2.6

如果字典包含可以保存引用的内容,则可以使用一个字典查找对其进行默认或更新:

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

但是,如果他们的数字是

,则无法以相同的方式修改字典条目
d.setdefault('k', 0) += 1  # doesn't work

相反,您需要执行两次dict查找,一次用于读取,一次用于写入:

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

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

1 个答案:

答案 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]