2012-07-14 7 views
7

私はPython 3.2.3を使用しています。逆にリストを反復する最も速い方法は何ですか? [:: - 1]、reverse、list.reverse()か他の方法でしょうか?私は約5e6要素程度のリストを扱っているので、リストをコピーすることを避ける必要があります。可能な限り逆順でPythonリストを反復処理する必要があります

+3

自分でテストしてください。 ['timeit'モジュール(http://docs.python.org/library/timeit.html)をチェックアウトすることをお勧めします。 –

答えて

13
>>> from timeit import Timer 
>>> t = Timer('[x for x in l[::-1]]', 'l = list(range(100000))') 
>>> t.timeit(number=1000) 
5.549649953842163 
>>> t = Timer('l.reverse(); [x for x in l]', 'l = list(range(100000))') 
>>> t.timeit(number=1000) 
4.548457145690918 
>>> t = Timer('[x for x in reversed(l)]', 'l = list(range(100000))') 
>>> t.timeit(number=1000) 
4.428632974624634 

結論:逆転します() 100000項目のリストのl.reverse()よりわずかに速いです。 これは、リスト全体を実際にループしない場合はもちろん、リストを複数回使用すると真になりません。

l[::-1]は、reversed()を導入した旧式です。

13

reversedは、イテレータを返すので、リストをコピーするのではなく、一度に1つの要素だけを返すので、ベストであるべきです。 (list.reverse()もリストをコピーしませんが、それはそれを変異させますので、設定が完了した後reversedは、元のリストを変更しないのに対し、リストは、逆方向になります。)

+1

イテレータは必ずコピーを防止するわけではないことに注意してください。この場合、イテレータはうまく動作します。 –

+1

これは本当ですが、一般的にイテレータを提供するビルトインのPython関数はリスト全体を一度に構築するものではありません。それが彼らの全ポイントです。 – BrenBarn

関連する問題