【发布时间】:2013-05-09 15:07:18
【问题描述】:
在 Python 中至少有两种方法可以反转列表,但迭代器方法要快得多(至少在 Python 2.7.x 中)。我想了解造成这种速度差异的原因。
>>> x = range(1000)
>>> %timeit x[::-1]
100000 loops, best of 3: 2.99 us per loop
>>> %timeit reversed(x)
10000000 loops, best of 3: 169 ns per loop
我怀疑速度差异至少是由于以下原因:
-
reversed是用 C 编写的 -
reversed是一个迭代器,因此内存开销更少
我尝试使用dis 模块来更好地了解这些操作,但这并没有太大帮助。我不得不将这些操作放在一个函数中来反汇编它们。
>> def reverselist(_list):
... return _list[::-1]
...
>>> dis.dis(reverselist)
2 0 LOAD_FAST 0 (_list)
3 LOAD_CONST 0 (None)
6 LOAD_CONST 0 (None)
9 LOAD_CONST 1 (-1)
12 BUILD_SLICE 3
15 BINARY_SUBSCR
16 RETURN_VALUE
>>> def reversed_iter(_list):
... return reversed(_list)
...
>>> dis.dis(reversed_iter)
2 0 LOAD_GLOBAL 0 (reversed)
3 LOAD_FAST 0 (_list)
6 CALL_FUNCTION 1
9 RETURN_VALUE
在切片操作期间到底发生了什么,是否有很多内存开销?也许切片是用纯 Python 实现的?
【问题讨论】:
-
附带说明,我不必为了使用
dis模块而将这些操作放入方法中。 This post 有一个漂亮的小lambda,而不是先编译代码字符串(必需),然后将其传递给dis.dis。
标签: python