报告的“建设速度”比率仅适用于constant元组(其项目由文字表达的元组)。仔细观察(并在您的计算机上重复 - 您只需在 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
模块代表您进行循环;-),每次都会重新构造一个新的列表对象 - 并且该构造(就像当编译器无法简单地将其识别为编译时常量和不可变对象时元组的构造)确实需要一点时间。
话虽这么说,元组构造(当两个构造实际上都必须
发生)仍然是列表构建速度的大约两倍——并且that差异可以通过元组的纯粹简单性来解释,其他答案已经多次提到过。但是,这种简单性并不能说明六倍或更多的加速,正如您仅比较列表和元组的构造以及简单常量文字作为其项目时所观察到的那样!_)