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纳秒。不过,它几乎是两个差的一个因子。您(隐式地)将优化工作重点放在有意义的地方,这是一个很好的观点,但仍然是。