Python でリストを逆にする方法は少なくとも 2 つありますが、イテレータ アプローチの方がはるかに高速です (少なくとも 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で実装されているのでしょうか?