

pandasに限らないと思うのですが、大きなサイズのdataframeを扱う場合、加工後は代入して使いまわしたほうが良いのでしょうか？

[code]

        df = df.drop()
    または
        df2 = df.drop()
    
[/code]

補足  
代入したほうがガベージコレクションによってメモリを開放してくれるのかなと思いました。


CC BY-SA 4.0
2023-05-17T02:08:34.743
94875
2023-05-28T02:12:32.860
2023-05-27T08:56:32.673
58325
58325
question
python pandas
pandas dataframeはなるべく使いまわしたほうが良いのでしょうか？


代入した方が可読性を保ちやすいと思います。  
また、処理上、不要になったdfは削除することでメモリを節約できるのではないでしょうか？


CC BY-SA 4.0
2023-05-20T00:23:26.613
94919
2023-05-20T00:23:26.613
38072
94875
answer


まずは、一般的な話をします。

  * 副作用が無い。
  * 処理が重い。
  * 最適化がされない。

このような場合は、一時的な変数に入れた方が計算量的に有利な場合が多いです。

* * *

質問であげている[pandas.DataFrame.drop](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html)をみると、引数で`inplace=True`を指定しない限り、元のデータは変更されない、つまり、副作用が無いとなります。また、列や行を削除するという処理は(先頭や最後の場合を除いて)かなり重い処理です。最後に、Pythonはコンパイル言語ではないため、最適化もされません。よって、このような場合は使い回した方が良いでしょう。

なお、ガベコレの話をしていますが、変数に代入することで、変数が生きている内はガベコレに回収されなくなると言うだけです。一旦代入しておかないとガベコレによって回収されないわけではありません。それとも、もとの`df`に入っていたデータを消したいというのであれば、`inplace=True`を使った方が良いかもしれません。どちらにしても、Pythonのようなガベコレがある言語では、通常のローカル変数に入っているデータはすぐに寿命が無くなって勝手に消えるので、グローバル変数やインスタンス変数でない限り、それほど気にしても余り意味が無い(もっと違う所に注意を向けるべき)かと思います。グローバル変数やインスタンス変数は、その値はどうあるべきかという意味論になるので、代入するしないは別次元の話になると思います。

* * *

なお、変数に入れない方が良いというのもあります。もし、副作用があるのであれば、呼び出す回数によって結果が変わるため、そもそも代入した場合、代入しなかった場合が同じ結果になりません。また、Cの配列のインデクスアクセスとか、JavaScriptのプロパティアクセスなどは、変数アクセスとほぼ変わらない処理速度なので、代入する方が無駄とかあります。他にも、C++等のコンパイルする言語では、副作用が無いことがわかっている場合に最適化によって処理が一回しか行わないようにする、つまり、代入に入れた場合と同じような処理をする事もあります。その場合は、無理に変数に代入しない方が場合もあります。


CC BY-SA 4.0
2023-05-28T02:12:32.860
94993
2023-05-28T02:12:32.860
7347
94875
answer