文章目录
1. 结论
在python2中:key in dict比key in dict.keys()快,因为.keys()创建了一个键的列表。dict.keys()速度减慢。
在python3中:dict.keys()返回的是可迭代对象,因此in dict.keys()的执行方式类似于in dict
2. 原因
Python2中:
dict.keys()涉及额外的函数调用(堆栈开销)。
dict.keys()返回一个列表,其中包含内存中的所有键(与惰性生成器对象相反)。因此它需要分配内存。
key in dict可以在内部使用set对象,这是索引查找。key in dict.keys()是列表中的线性搜索。
3. 案例论证
# coding=utf-8
import sys
import random
import line_profiler
alphabet = 'abcdefghijklmnopqrstuvwASDFKJKLJWQOPEUIRZXCVxyz!@#$%^&*'
def create_dict():
my_dict = dict()
for i in range(10000000):
my_key1 = random.choice(alphabet) + 'abc'
my_key2 = random.choice(alphabet) + 'xyz'
my_key3 = random.choice(alphabet) + 'python2 is loser'
my_value = random.randint(1, 10000)
my_dict[(my_key1, my_key2, my_key3)] = my_value
return my_dict
dic = create_dict()
find_list = [(random.choice(alphabet) + 'abc', random.choice(alphabet) + 'xyz',
random.choice(alphabet) + 'python2 is loser') for i in range(1000)]
def test():
for i in find_list:
if i in dic:
pass
for i in find_list:
if i in dic.keys():
pass
profile = line_profiler.LineProfiler(test)
profile.enable()
test()
profile.disable()
profile.print_stats(sys.stdout)
Python2运行的结果:
从图中可以看出,总共用时13.3939秒,但时间基本都被第30行:if i in dic.keys()占用。而第27行:if i in dic所用的时间相对来说是忽略不计的。
Python3运行的结果:
从图中可以看出,一模一样的代码,Python3的总时间只用了0.00323405秒。秒杀Python2。
第27行: if i in dic 和第30行: if i in dic.keys()所用时间在一个量级上,基本上差不多。
4. 总结
除了上文提到的 dict.keys()的改变,Python3相对Python2也有很多其他类似的改变,如:字典对象的 dict.values() 、dict.items()方法都不再返回列表,而是以一个类似迭代器的 “view” 对象返回。 map、filter、zip从函数变成了类,其次,它们的返回结果也从当初的列表成了一个可迭代的对象。
附录
Python2和Python3有哪些区别|全面总结|专业避坑
Python2和Python3有哪些区别|全面总结|专业避坑
Python中文编码问题(字符串前面加‘u‘|decode|encode)
Python中文编码问题(字符串前面加‘u‘|decode|encode)