简短回答:在python 2中:您的假设是正确的:dict.keys()速度减慢。
在python 3中:您的假设不正确: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): --> 0.000598 s
--> 5.191553 s
我还测试了迭代次数和交换的dict大小(dict只有100个条目,一百万次迭代)。 --> 3.614162 s
--> 7.007922 s
这里的结果更接近。
因此,性能差异确实随着dict的大小而增大
Python 3答案:
我改编了python 3的脚本:xrange已不存在,请改用range。(不在测试功能的性能关键内环中,因此对性能的影响有限)
对print使用大括号
将沙邦线改为#!/usr/bin/python3
并在同一台机器上用Python3.4.3进行了测试。dict_size=1000000;num_iterations=100
f-->;0.000590秒
g-->;0.000565秒
dict_size=100;num_iterations=1000000
f-->;4.525487秒
g-->;4.837232秒
所以在python 3中,性能差异消失了。