这个 题 和我的 回答 让我思考Python 2.7和Python 3.4之间的这种特殊区别。以简单的示例代码为例:
import timeit
import dis
c = 1000000
r = range(c)
def slow():
for pos in range(c):
r[pos:pos+3]
dis.dis(slow)
time = timeit.Timer(lambda: slow()).timeit(number=1)
print('%3.3f' % time)
在Python 2.7中,我始终如一 0.165~
而对于Python 3.4我一直都有 0.554~
。反汇编之间唯一重要的区别是Python 2.7发布了 SLICE+3
Python 3.4发出时的字节代码 BUILD_SLICE
其次是 BINARY_SUBSCR
。请注意,我已经从其他问题中消除了潜在减速的候选者,即字符串和事实 xrange
在Python 3.4中不存在(它应该与后者类似) range
无论如何班级)。
运用 itertools'
islice
在两者之间产生几乎相同的时间,所以我高度怀疑这是切片,这是造成差异的原因。
为什么会发生这种情况,是否有链接到记录行为变化的权威来源?
编辑:为了回答答案,我已经包装了 range
对象 list
,确实给出了明显的加速。但是随着我增加了迭代次数 timeit
我注意到时间差异变得越来越大。作为一个完整性检查,我用切换替换了切片 None
看看会发生什么。
500次迭代 timeit
。
c = 1000000
r = list(range(c))
def slow():
for pos in r:
None
产量 10.688
和 9.915
分别。用。替换for循环 for pos in islice(r, 0, c, 3)
产量 7.626
和 6.270
分别。更换 None
同 r[pos]
产生 20~
和 28~
分别。 r[pos:pos+3]
产量 67.531
和 106.784
分别。
如您所见,时间差异很大。同样,我仍然相信这个问题与此没有直接关系 range
。