Python では,言語処理系(CPython)の機能として実装されている「ガベージコレクション」(以下,GC)によって,不要になったメモリ領域を自動的に解放している.GC の機能が無い言語の場合,手動でやらなければならないが,Python には GC の機能がついているため,使用者がこれを意識する必要はあまりない.
本記事では,Python の処理系が GC を行うタイミングをざっくりまとめた.
python で GC が行われるタイミング
Python のプログラムが動作している最中で,GC が行われるタイミングを挙げてみる.主に以下の 3 つ.
オブジェクトの参照を切る
- 参照を切る
a = 'fuga' a = 'piyo' # ここで 'fuga' の参照が切れ,メモリが解放される
変数を del 文で消去し,「最後の」参照を切る
del 文で参照が切れる場合と切れない場合の例を見る.
- del 文で参照が切れる場合
以下のコードでは,変数 a が消去されたタイミングで 'fuga'
への参照が切れるため,'fuga'
に使用されているメモリは解放される.
a = 'fuga' del a
- del 文で参照が切れない場合
以下のコードでは,変数 a が消去されたタイミングでも,'fuga'
は変数 b から参照されており,参照は完全には切れていない.
a = 'fuga' b = a del a # まだ b による 'fuga' への参照が残っている
上記のコードに del b
を足すと,'fuga'
への参照が完全に切れ,'fuga'
(str 型オブジェクト)に使用されていたメモリは解放される.
a = 'fuga' b = a del a # まだ b による 'fuga' への参照が残っている del b # 'fuga' への参照が完全に切れ,'fuga' のメモリが解放される
標準モジュール gc を用いて手動で GC を行う
import gc a = 'fuga' del a gc.collect() # 即時 GC が行われる
詳細は以下のドキュメントを参照.