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

Aar*_*lin 6 python performance

如何:

dict = {}
if key not in dict:
 dict[key] = foo
Run Code Online (Sandbox Code Playgroud)

相比于:

try:
 dict[key]
except KeyError:
 dict[key] = foo 
Run Code Online (Sandbox Code Playgroud)

也就是说,无论如何都要比线性搜索更快地查找一个键dict.keys(),我假设第一个表单会做什么?

Ned*_*der 7

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


Chr*_*ams 6

您正在寻找setdefault方法:

>>> r = {}
>>> r.setdefault('a', 'b')
'b'
>>> r
{'a': 'b'}
>>> r.setdefault('a', 'e')
'b'
>>> r
{'a': 'b'}
Run Code Online (Sandbox Code Playgroud)


Dun*_*can 4

答案取决于键在字典中出现的频率(顺便说一句,有人向你提到过隐藏内置函数(例如隐藏在dict变量后面)是多么糟糕的想法吗?)

if key not in dct:
 dct[key] = foo
Run Code Online (Sandbox Code Playgroud)

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

try:
 dct[key]
except KeyError:
 dct[key] = foo 
Run Code Online (Sandbox Code Playgroud)

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

dct.setdefault(key, foo)
Run Code Online (Sandbox Code Playgroud)

setdefault这个有点棘手:它总是涉及两次字典查找:第一个是在类中查找方法,第二个是在对象中dict查找。此外,如果是一个表达式,每次都会对其进行求值,而早期的选项仅在必须时才对其进行求值。keydctfoo

还看看collections.defaultdict。对于一大类这样的情况,这是最合适的解决方案。