【发布时间】:2017-12-20 21:28:45
【问题描述】:
我最近发现了一些令人惊讶的事情。给定不包含键 k 的字典 d,使用三元运算符尝试检索具有默认返回的项目:
>>> def tern():
... d[k] if k in d else 'foo'
...
>>> timeit.timeit(tern, number=1000000)
0.12342095375061035
运行速度比 dict 的 .get() 函数快:
>>> def get_meth():
... d.get(k, 'foo')
...
>>> timeit.timeit(get_meth, number=1000000)
0.20549297332763672
这对我来说似乎违反直觉。我认为三元运算符需要通过 dict 进行 2 次搜索(一次用于测试 k in d),然后再进行一次以检索 d[k],而 .get 将简单地尝试检索 d[k],如果失败,则返回'foo'.
我在一个大字典(一百万个元素)和一个小字典(100 个)上都运行了这个,而且这两次,三进制都明显更快。这里的幕后发生了什么?
【问题讨论】:
-
你多久打一次
else? -
"给定一个不包含密钥
k的字典d",所以每次 -
鉴于密钥永远不会在您的测试中的字典中,因此您的三元表达式的
d[k]部分永远不会执行。因此,在任何一种情况下都只进行一次查找。剩下的就是在d.get()中有另一个字典查找:必须在包含d方法的字典中查找属性“get”。 -
设置
m = d.get,把函数体改成m(k, 'foo'),你会看到很大的不同 -
好的,有趣的结果:设置
m=d.get和运行当前项目都仍然有三元优于get
标签: python python-2.7 dictionary