7

可能重复:
“has_key()”还是“in”?

在 Python 中,有两种方法可以确定 akey是否在 a 中dict

if dict.has_key(key)if key in dict

有人告诉我第二个比第一个慢,因为in关键字使表达式对字典进行迭代,所以它会比has_key替代方案慢,后者显然使用哈希来做出决定。

由于我高度怀疑差异,因为我认为 Python 足够聪明,可以将 ain之前的关键字转换dict为某种哈希方式,因此我找不到任何关于此的正式声明。

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

谢谢。

4

3 回答 3

9

这两个操作都做同样的事情:检查在字典中实现的哈希表的键。两者都不会迭代整个字典。请记住,for x in dict它不同于if x in dict. 它们都使用in关键字,但操作不同。

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

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

顺便说一句,一般的偏好是key in dictdict.has_key(key). 请注意,速度与偏好无关。除非您知道自己处于关键路径中,否则可读性比速度更重要。

于 2012-07-09T01:27:44.973 回答
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
于 2012-07-09T01:32:51.697 回答
3

has_key不是替代方案。它已被弃用。不要使用它。(反正比较慢)

于 2012-07-09T01:37:29.523 回答