Python中dict.has_key和key in dict的效率差异

7
在Python中,判断一个键是否在字典中有两种方法: if dict.has_key(key)if key in dict 有人告诉我第二种方法比第一种方法慢,因为in关键字使表达式成为字典的迭代,所以它会比has_key的替代方案慢,后者显然使用哈希来做出决策。
我非常怀疑这种差异,因为我认为Python足够聪明,能够将in关键字在字典之前转换为某种哈希方式,但是我找不到任何正式声明。
那么这两者之间真的有效率差异吗?
谢谢。
3个回答

9
这两个操作的作用相同:检查dict中实现的哈希表是否有key。它们都不会遍历整个字典。请记住,for x in dict与if x in dict是不同的操作。它们都使用in关键字,但是操作不同。
in关键字成为dict.__contains__上的调用,dict可以按任何喜欢的方式进行实现。
如果这些操作的时间上有差异,那么差异将非常小,并且与has_key的函数调用开销有关。
顺便说一下,通常更喜欢key in dict,因为它比dict.has_key(key)更清晰地表达了意图。请注意,速度与偏好无关。除非您知道自己处于关键路径中,否则可读性比速度更重要。

2
所有这些,另外,“has_key()”已被弃用,不应再使用。 :) - jonesy

3

has_key 并不是一个替代方案。它已被弃用,请不要使用它(而且它会更慢)。


3

D.has_key由于函数调用而实际上更慢:

>>> 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

考虑到timeit运行语句一百万次,而数字是以秒为单位的,因此绝对时间差非常小。 - jterrace
大约80纳秒左右。 - jterrace
这几乎是一个两倍的差异。你提出了一个好观点(隐含地)关于将优化努力集中在有意义的地方,但仍然如此。 - Karl Knechtel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接