ここでは、スタックオーバーフローに関するコメントを読んで、リストを変更するときにスライスの割り当てを行う方が効率的です。後者は、新しいリストを作成し、その新しいリストにa
を再バインド前者は、既存のリスト内の要素を置換するため、例えば、Pythonスライスの代入メモリの使用
a[:] = [i + 6 for i in a]
は残し、
a = [i + 6 for i in a]
より効率的でより多くのメモリであるべきです古いa
がガベージコレクションされるまでメモリに残っています。スピードのための2つのベンチマーク、後者はやや高速です:
$ python -mtimeit -s 'a = [1, 2, 3]' 'a[:] = [i + 6 for i in a]'
1000000 loops, best of 3: 1.53 usec per loop
$ python -mtimeit -s 'a = [1, 2, 3]' 'a = [i + 6 for i in a]'
1000000 loops, best of 3: 1.37 usec per loop
は、変数を再バインドするよう、リスト内の要素を交換するよりも高速である必要があります。しかし、私はメモリ使用量の主張をサポートする正式な文書を見つけることができません、そして、私はそれをベンチマークする方法がわかりません。
メモリ使用量の主張は私にとっては理にかなっています。しかし、私は以前の方法では、前者の方法では、リストの理解から新しいリストを作成し、をの値にコピーして、a
に値をコピーし、ガベージコレクションされています。そうであれば、前者の方法は同じ量のメモリを使用し、同時に遅くする。
2人の方法のどちらがより効率的なメモリであるかをベンチマークや公式の文書で明示的に示すことはできますか?
ありがとうございます。
パフォーマンス面で検討する価値はあるかもしれませんが、Class1からClass2への参照を渡す実用的なケース(大きなプログラムでは)に遭遇する可能性が高いと思います。最初の例では、スライス割り当てを使用してClass1のリストを変更すると、Class2の参照が保持されます。 2番目のインスタンスでは、Class1のリストを変更すると、Class2はもはや有効ではないリストへの参照を保持します。 – Brandon
@Brandon:それも当てはまりますが、私はおそらく私の質問でその区別を述べておくべきでした。あなたのご意見ありがとうございます。 –