Pythonでリストを逆転させる方法は少なくとも2つありますが、少なくともPython 2.7.xではイテレータの方がはるかに高速です。私はこのスピードの違いに何が寄与しているのか理解したい。リストを反復するよりも遅いリストを反転させる理由
reversed
イテレータので、少ないメモリオーバーヘッド
Iを
reversed
C>>> 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
Iは、速度差は、少なくとも以下に起因している疑い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」モジュールを使用するために、これらの操作をメソッドに入れる必要はありませんでした。 [この記事](http://stackoverflow.com/questions/13270888/why-is-startswith-slower-than-slicing)は、コード文字列を最初にコンパイルするよりも少し素敵な 'lambda'を持っています(必須) dis.dis'。 –