【问题标题】:Efficiency difference between dict.has_key and key in dict in Python [duplicate]Python中dict.has_key和dict中的key之间的效率差异[重复]
【发布时间】:2012-07-09 01:25:43
【问题描述】:

可能重复:
'has_key()' or 'in'?

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

if dict.has_key(key)if key in dict

有人告诉我,第二个比第一个慢,因为 in 关键字使表达式在 dict 上进行迭代,所以它会比 has_key 替代品慢,后者显然使用哈希来制作决定。

由于我非常怀疑两者之间的区别,因为我认为 Python 足够聪明,可以将 dict 之前的 in 关键字转换为某种哈希方式,因此我找不到任何关于此的正式声明。

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

谢谢。

【问题讨论】:

    标签: python performance dictionary


    【解决方案1】:

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

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

    如果这些操作的时间有差异,会非常小,和has_key的函数调用开销有关。

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

    【讨论】:

    • ....所有这些,此外,'has_key()' 已被弃用,不应再使用。 :)
    【解决方案2】:

    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 运行语句一百万次,数字以秒为单位,绝对时间差很小
      • 大约 80 纳秒..
      • 不过,这几乎是两倍的差异。您提出了一个很好的观点(隐含地)将优化工作集中在有意义的地方,但仍然如此。
      猜你喜欢
      • 2018-06-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2018-06-22
      • 2012-11-21
      • 2012-12-16
      • 2020-03-26
      相关资源
      最近更新 更多