字典键查找的性能如何在Python中进行比较?

时间:2010-09-09 18:05:24

标签: python performance

如何:

dict = {}
if key not in dict:
 dict[key] = foo

比较:

try:
 dict[key]
except KeyError:
 dict[key] = foo 

即,通过dict.keys()进行线性搜索比检查密钥更快,我认为第一种形式会做什么?

5 个答案:

答案 0 :(得分:5)

您正在寻找setdefault方法:

>>> r = {}
>>> r.setdefault('a', 'b')
'b'
>>> r
{'a': 'b'}
>>> r.setdefault('a', 'e')
'b'
>>> r
{'a': 'b'}

答案 1 :(得分:5)

只是澄清一点:if key not in d不通过d键进行线性搜索。它使用dict的哈希表来快速找到密钥。

答案 2 :(得分:4)

尝试:my_dict.setdefault(key, default)。不过,它比其他选项略慢。

  

如果key在字典中,则返回其值。如果没有,请插入值key的{​​{1}}并返回defaultdefault默认为无。

default

答案 3 :(得分:4)

答案取决于密钥已经在密码中的频率(顺便说一句,有人向你提到隐藏变量后面的内置文件如dict有多糟糕吗?)

if key not in dct:
 dct[key] = foo

如果密钥在字典中,则执行一次字典查找。如果密钥在字典中,它会查找字典两次。

try:
 dct[key]
except KeyError:
 dct[key] = foo 

对于密钥在字典中的情况,这可能稍快一些,但抛出异常会产生相当大的开销,因此它几乎总是不是最佳选择。

dct.setdefault(key, foo)

这个有点棘手:它总是涉及两个字典查找:第一个是在setdefault类中查找dict方法,第二个是在key中查找dct foo对象。此外,如果collections.defaultdict是表达式,则每次都会对其进行评估,而之前的选项仅在必要时对其进行评估。

另请参阅{{1}}。对于像这样的大类情况,这是最合适的解决方案。

答案 4 :(得分:-1)

如果key不在my_dict中,则

my_dict.get(key, foo)返回foo。默认值为None,因此如果key不在my_dict中,my_dict.get(key)将返回None。如果您只想将密钥添加到字典中,则第一个选项会更好。这里不要担心速度。如果您发现填充字典是程序中的热点,那么请考虑一下。但事实并非如此。所以不要。