22

通常、よりPythonic /より良い/より速く使用できると見なされるもの、逆の方法、または逆の組み込み関数は何ですか?

両方の動作:

_list = list(xrange(4))

print _list

rlist = list(reversed(_list))

print rlist

_list.reverse()

print _list
4

6 に答える 6

53

foo.reverse()実際には、コンテナ内の要素を逆にします。reversed()実際には何も反転せず、コンテナの要素を逆の順序で反復処理するために使用できるオブジェクトを返すだけです。それが必要な場合は、実際に要素を逆にするよりも高速であることがよくあります。

于 2011-07-24T22:06:59.570 に答える
15

大きな違いがあるようです。本当に逆だと思いました。イテレータから新しい値を作成するよりも、リスト内の値を再配置する方が速いのはなぜですか?

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

于 2011-07-24T22:23:19.427 に答える
12

リストをインプレースで反転する(つまり、リストを変更する)かどうかによって異なります。他に本当の違いはありません。

多くの場合、使用reversedするとより良いコードにつながります。

于 2011-07-24T22:02:23.593 に答える
3

パフォーマンスに関する実際の統計を知らなくても_list.reverse()、リスト自体を変更しreversed(_list)ますが、逆の順序でリストをトラバースする準備ができているイテレータを返します。それ自体が大きな違いです。

それが問題ではない場合、object.reverse()私には読みやすいように見えますが、特定の速度要件があるかもしれません。そして、reverse()リソースを消費しているソフトウェアの80%に属していない場合、私は気にしません(一般的な経験則として)。

于 2011-07-24T22:09:42.333 に答える
1
  • _list.reverse()はインプレース反転を実行し、値を返しません
  • reverse(_list)は_listを変更しませんが、逆反復可能なオブジェクトを返します
  • _list [::-1]は_listを変更しませんが、逆スライスを返します

例:

_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
于 2019-11-08T04:07:09.773 に答える
0

最終的にイテレータでリストを変更してリストを不変にし、関数型プログラミングを行う場合は特に不変データの操作が常に優れている場合は、reversed()を使用することをお勧めします。

于 2019-08-01T11:04:46.857 に答える