python: pythonのメモリ管理について
備忘録です。今回はpythonのメモリ管理について。最近PCで行っている処理が結構時間がかかるものが多く、今のマックを購入するときは、プログラムできたらいいやって感じであまり考えていなかったけど、今後メモリの管理やハード面についても考えていかないとです。
Pythonのメモリ管理について
python処理系
ブラウザ上で動作する簡易的なPythonの実行環境。C言語で実装されたCPython。
pythonのメモリ管理方法
- 不要になったオブジェクトはメモリから自動で消去される。
- 参照カウントを使った方式と世代別ガーベージコレクションの方式の二つでメモリ管理を行っている。
参照カウント方式
- 全てのオブジェクトは参照カウントが0の状態で生成され、他のオブジェクトから参照された時などにそのカウントを1繰り上げる。
- オブジェクトの参照がなくなると1参照カウントを差し引きする。
- 0になったときにpythonのインタプリンタによって消去される。
参照カウントが増えるケース
- 代入演算子を使った時
- 関数の引き渡しをした時
- コンテナ型オブジェクト(リスト、タプル、クラスなど)に追加した時
循環参照
複数のオブジェクトがループ状に違いを参照すること(この状況が起きると参照カウントが0にならないためメモリが解放されない)
世代別ガーベージコレクション
- 循環参照となっても正しく処理される
- メモリが不足したタイミングなどでpythonのインタプリンタによって自動的に呼び出される(明示的に呼び出すことも可能)
弱参照
- weakrefモジュールを使用
- 参照カウントを増やすことなく別のオブジェクトを参照する機能
メモリ使用量の改善
途中計算などで不要な計算結果などを保持せず消去する