通常、よりPythonic /より良い/より速く使用できると見なされるもの、逆の方法、または逆の組み込み関数は何ですか?
両方の動作:
_list = list(xrange(4))
print _list
rlist = list(reversed(_list))
print rlist
_list.reverse()
print _list
foo.reverse()
実際には、コンテナ内の要素を逆にします。reversed()
実際には何も反転せず、コンテナの要素を逆の順序で反復処理するために使用できるオブジェクトを返すだけです。それが必要な場合は、実際に要素を逆にするよりも高速であることがよくあります。
大きな違いがあるようです。本当に逆だと思いました。イテレータから新しい値を作成するよりも、リスト内の値を再配置する方が速いのはなぜですか?
from decorators import bench
_list = range(10 ** 6)
@ bench
def foo():
list(reversed(_list))
@ bench
def bar():
_list.reverse()
foo()
bar()
print foo.time
print bar.time
0.167278051376
0.0122621059418
リストをインプレースで反転する(つまり、リストを変更する)かどうかによって異なります。他に本当の違いはありません。
多くの場合、使用reversed
するとより良いコードにつながります。
パフォーマンスに関する実際の統計を知らなくても_list.reverse()
、リスト自体を変更しreversed(_list)
ますが、逆の順序でリストをトラバースする準備ができているイテレータを返します。それ自体が大きな違いです。
それが問題ではない場合、object.reverse()
私には読みやすいように見えますが、特定の速度要件があるかもしれません。そして、reverse()
リソースを消費しているソフトウェアの80%に属していない場合、私は気にしません(一般的な経験則として)。
例:
_list = [1,2,3]
ret1 = list(reversed(_list))
ret2 = _list[::-1] #reverse order slice
ret3 = _list.reverse() #no value set in ret3
print('ret1,ret2,ret3,_list:',ret1,ret2,ret3,_list)
_list = [1,2,3]
for x in reversed(_list):
print(x)
出力:
ret1,ret2,ret3,_list: [3, 2, 1] [3, 2, 1] None [3, 2, 1]
3
2
1
最終的にイテレータでリストを変更してリストを不変にし、関数型プログラミングを行う場合は特に不変データの操作が常に優れている場合は、reversed()を使用することをお勧めします。