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

Python中dict.has_key和dict中key的效率差异,python,performance,dictionary,Python,Performance,Dictionary,可能重复: 在Python中,有两种方法可以确定键是否位于dict中: 如果dict.has_key(key)和如果dict.has_key(key) 有人告诉我,第二个比第一个慢,因为in关键字使表达式在dict上迭代,因此它将比has_key替代项慢,后者显然使用散列来做出决定 我非常怀疑这一点,因为我认为Python足够聪明,可以将dict之前的in关键字转换为某种散列方式,所以我找不到任何正式的说法 那么这两者之间真的有效率差异吗 谢谢。这两个操作的作用相同:检查dict中实现的哈希表

可能重复:

在Python中,有两种方法可以确定
键是否位于
dict
中:

如果dict.has_key(key)
如果dict.has_key(key)

有人告诉我,第二个比第一个慢,因为
in
关键字使表达式在dict上迭代,因此它将比
has_key
替代项慢,后者显然使用散列来做出决定

我非常怀疑这一点,因为我认为Python足够聪明,可以将
dict
之前的
in
关键字转换为某种散列方式,所以我找不到任何正式的说法

那么这两者之间真的有效率差异吗


谢谢。

这两个操作的作用相同:检查dict中实现的哈希表中的键。两者都不会迭代整个字典。请记住,dict中x的
与dict中x的
不同。它们都使用
关键字中的
,但操作不同

关键字中的
变成了对
dict的调用。dict包含了dict,dict可以随意实现它

如果这些操作的计时存在差异,则差异将非常小,并且与
has\u key
的函数调用开销有关


顺便说一句,一般首选dict中的
key
,作为比
dict.has\u key(key)
更清晰的意图表达。请注意,速度与偏好无关。可读性比速度更重要,除非您知道自己处于关键路径。

D.has\u 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

has_key
不是一个替代方案。它已被弃用。不要用它。(无论如何速度较慢)

…所有这些,此外,“has_key()”已被弃用,不应再使用。:)考虑到它运行语句一百万次的时间,这个数字是以秒为单位的,绝对时间差非常小,大约80纳秒。不过,它几乎是两个差的一个因子。您(隐式地)将优化工作重点放在有意义的地方,这是一个很好的观点,但仍然是。