所报告的“构建速度”比率仅适用于 常量 元组(其项目由文字表示的元组)。仔细观察(并在您的机器上重复-您只需要在shell
/命令窗口中键入命令即可!)…:
$ python3.1 -mtimeit -s'x,y,z=1,2,3' '[x,y,z]'1000000 loops, best of 3: 0.379 usec per loop$ python3.1 -mtimeit '[1,2,3]'1000000 loops, best of 3: 0.413 usec per loop$ python3.1 -mtimeit -s'x,y,z=1,2,3' '(x,y,z)'10000000 loops, best of 3: 0.174 usec per loop$ python3.1 -mtimeit '(1,2,3)'10000000 loops, best of 3: 0.0602 usec per loop$ python2.6 -mtimeit -s'x,y,z=1,2,3' '[x,y,z]'1000000 loops, best of 3: 0.352 usec per loop$ python2.6 -mtimeit '[1,2,3]'1000000 loops, best of 3: 0.358 usec per loop$ python2.6 -mtimeit -s'x,y,z=1,2,3' '(x,y,z)'10000000 loops, best of 3: 0.157 usec per loop$ python2.6 -mtimeit '(1,2,3)'10000000 loops, best of 3: 0.0527 usec per loop
我没有在3.0上进行测量,因为我当然没有它-它已经完全过时了,绝对没有理由保留它,因为3.1在各个方面都优于它(Python
2.7,如果您可以升级到它,每个任务的执行速度比2.6快20%,而2.6比3.1快。因此,如果您非常在意性能,Python
2.7确实是您应该唯一的发行版本争取!)。
无论如何,这里的关键点在于,在每个Python版本中,从常量文字中构造列表的速度大约与从变量引用中构造值的速度相同或稍慢。但是元组的行为却大不相同-
从常量文字中构建元组通常比从变量引用的值中构建元组快三倍!您可能想知道这怎么可能,对吧?
答案:由常量文字组成的元组可以很容易地被Python编译器识别为一个不变的常量文字本身:因此,当编译器将源代码转换为字节码并保存在“常量表”中时,它实际上只构建了一次相关功能或模块的“”。当这些字节码执行时,它们只需要恢复预构建的常量元组-嘿,很高兴!-)
这种简单的优化无法应用于列表,因为列表是可变对象,因此至关重要的是,如果相同的表达式(如
[1, 2,3]执行两次)(在循环中-
timeit模块代表您执行循环;-),每次都会重新构造一个新的列表对象-
并且这种构造(例如当编译器无法简单地将其标识为编译时常量和不可变对象时的元组构造)确实需要一些时间。
话虽这么说,元组构造(实际上必须同时发生两种构造)仍然快于列表构造的两倍- 这种
差异可以用元组的纯粹性来解释,其他答案也多次提到。但是,这种简单性并不能解决六倍或更多倍的加速问题,正如您观察到的那样,如果您只比较列表和元组的构造以及简单常量文字作为它们的项!_)



