关于性能:Python中dict.has_key和dict键之间的效率差异

Efficiency difference between dict.has_key and key in dict in Python

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
'has_key()' or 'in'?

在python中,有两种方法可以决定key是否在dict中:

if dict.has_key(key)if key in dict

有人告诉我,第二个比第一个慢,因为in关键字使表达式在dict上迭代,所以比has_key选项慢,后者显然使用hash来作出决定。

由于我非常怀疑两者的区别,因为我认为python足够聪明,可以将dict之前的in关键字转换为某种散列方式,所以我找不到任何正式的说法。

那么,这两者之间真的有效率上的区别吗?

谢谢。


这两个操作都做相同的事情:检查dict中实现的哈希表中的键。也不会重复整个字典。记住,for x in dictif x in dict不同。它们都使用in关键字,但操作不同。

in关键字变成了对dict.__contains__的调用,dict可以随心所欲地实现它。

如果这些操作的时间安排有差异,它将非常小,并且与has_key的函数调用开销有关。

顺便说一句,一般倾向于使用key in dict作为比dict.has_key(key)更清楚的表达意图。请注意,速度与偏好无关。可读性比速度更重要,除非你知道你在关键路径上。


has_key不是一种选择。它被否决了。不要使用它。(不管怎样都慢了)


由于函数调用,D.has_key实际上变慢了:

1
2
3
4
5
6
7
8
>>> D = dict((x, y) for x, y in zip(range(1000000), range(1000000)))
>>> from timeit import Timer
>>> t = Timer("1700 in D","from __main__ import D")
>>> t.timeit()
0.10631704330444336
>>> t = Timer("D.has_key(1700)","from __main__ import D")
>>> t.timeit()
0.18113207817077637