输入样本太小。查找全局名dict()比运行dict理解要花更多的时间(后者不需要名称查找),但是如果您针对一个大的个键值对dict()进行测试,则会获得成功,因为循环完全是在C中完成的
根据一个大的个键值对来测试差异,并将测试减少到只执行dict()调用或字典理解(对于这两种情况,zip()和{}调用只执行一次,可以忽略):>>> from timeit import timeit
>>> import random
>>> from string import ascii_lowercase
>>> kv_pairs = [(''.join(random.sample(ascii_lowercase, random.randint(10, 20))), ''.join(random.sample(ascii_lowercase, random.randint(10, 20))))
... for _ in xrange(10000)]
>>> len(dict(kv_pairs)) # the random keys happen to be all unique.
10000
>>> timeit('{k: v for k, v in kv_pairs}', 'from __main__ import kv_pairs', number=1000)
1.3174479007720947
>>> timeit('dict(kv_pairs)', 'from __main__ import kv_pairs', number=1000)
0.6737580299377441
>>> timeit('{k: v for k, v in kv_pairs}', 'from __main__ import kv_pairs; kv_pairs = kv_pairs[:3]')
0.511167049407959
>>> timeit('dict(kv_pairs)', 'from __main__ import kv_pairs; kv_pairs = kv_pairs[:3]')
0.6696300506591797
因此,对于10k个键值对(前两个计时测试),dict()的速度是前者的两倍,对于3对(后两个计时),dict理解获胜。在
您可以看到反编译字节码时的原因;字典理解使用嵌套代码对象来实现实际的字典构建:
^{pr2}$
通过使用一个非常小的示例,LOAD_NAME步骤给了dict太多的权重;dict理解涉及到更多的字节码,每次迭代都执行。在