Python中in和has_key的性能比较
最近写了一个代码中需要判断一个字典D
是否包含某个键值item
,然后我使用了if item in D:
,结果发现耗时很严重,于是改成if D.has_key(item)
,速度马上变快了很多。查阅了一些资料后,发现有一种说法是has_key
是python2保留的api,在python3中已经被删去,一般用if item in D
。因此决定继续探索这三种用法的的性能差别。
时间消耗对比
对字典大小为100到10000的字典分别使用in D
、in D.keys()
和has_key
判断键值是否存在,记录它们的时间消耗,并画出图形,代码如下。
import time
from matplotlib import pyplot as plt
n = 10000
time1 = []
time2 = []
time3 = []
for n in range(100,10100,100):
my_dict = {}
for i in range(n):
my_dict[i] = i
start = time.time()
for i in range(n):
if i in my_dict.keys():
pass
end = time.time()
print end - start
time1.append(end - start)
start = time.time()
for i in range(n):
if my_dict.has_key(i):
pass
end = time.time()
print end - start
time2.append(end - start)
start = time.time()
for i in range(n):
if i in my_dict:
pass
end = time.time()
print end - start
time3.append(end - start)
t = range(100,10100,100)
plt.plot(t, time1, label='in keys()')
plt.plot(t, time2, label='has_key')
plt.plot(t, time3, label='in')
plt.legend()
plt.show()
可见D.has_key
要比in D.keys()
快得多,而in D
比D.has_key
要稍微快一点。
结论
在判断一个值item
是否是某个字典D
的键值时,最佳的方法是if item in D
,它是最快的,其次的选择是if D.has_key(item)
,绝对不要使用if itme in D.keys()
。