直觉我认为key in dict
比key in dict.keys()
更快,因为.keys()
会创建一个键列表。这个问题是要确认这是否属实。
只是想知道key in dict
是否在内部创建/使用列表来查找密钥是否存在?
另外,一种方法比另一种更快吗?
答案 0 :(得分:10)
简答:
dict.keys()
放慢速度。in dict.keys()
的行为与in dict
py2和py3的详细信息如下。
Python 2.7回答:
您的假设是正确的,原因如下:
dict.keys()
涉及额外的函数调用(堆栈开销)。dict.keys()
返回一个列表,其中包含内存中的所有键(与惰性生成器对象相对)。因此,它需要分配内存。key in dict
可以在内部使用set对象,这是一个索引查找。 key in dict.keys()
是列表中的线性搜索我创建了一个小的benckmark脚本来表明我的观点:
#! /usr/bin/python2.7
import datetime as dt
import random
dict_size = 1000000
num_iterations = 100
d = {i: i for i in xrange(dict_size)}
def f():
k = random.randint(0,dict_size-1)
return (k in d)
def g():
k = random.randint(0,dict_size-1)
return (k in d.keys())
def test(func):
t = dt.datetime.utcnow()
for i in xrange(num_iterations):
func()
print "%s --> %1.6f s" % (func, (dt.datetime.utcnow()-t).total_seconds())
test(f)
test(g)
输出(python 2.7.6 Ubuntu 14.04):
<function f at 0x7ff2e0126d70> --> 0.000598 s
<function g at 0x7ff2e0126de8> --> 5.191553 s
我还测试了迭代次数和交换的dict大小(只有100个项目的dict,1M次迭代)。
<function f at 0x7f94cb5e6d70> --> 3.614162 s
<function g at 0x7f94cb5e6de8> --> 7.007922 s
这里的结果更加接近。
因此,性能差异确实随着字典的大小而增长。
Python 3回答:
我改编了python 3的脚本:
xrange
已消失,请改用range
。 (不在测试功能的性能关键内循环中,因此性能影响有限)print
#!/usr/bin/python3
在同一台机器上使用python 3.4.3进行测试。
dict_size = 1000000; num_iterations = 100
f - &gt; 0.000590 s g - &gt; 0.000565 s
dict_size = 100; num_iterations = 1000000
f - &gt; 4.525487 s g - &gt; 4.837232 s
所以在python 3中,性能差异消失了。