Upgrade to Pro — share decks privately, control downloads, hide ads and more …

みんなのPython勉強会#100 LT枠 参照カウントから見るPythonのメモリ管理

みんなのPython勉強会#100 LT枠 参照カウントから見るPythonのメモリ管理

2024/01/25 で開催された みんなのPython勉強会#100の資料

https://startpython.connpass.com/event/304688/

Yusuke Tamura

January 25, 2024
Tweet

More Decks by Yusuke Tamura

Other Decks in Technology

Transcript

  1. @ 2024 Novasell, Inc. All Rights Reserved. Introduction GitHub: @tamtam-fitness,

    X: @TamtamFitness, Zenn: Tamtam Tamtamといいます 💪 ラクスル (株) の新卒2年⽬のエンジニア📃📺 Pythonを⽤いたバックエンド開発や機械学習 および⽣成AIの経験をしてきました 🐍
  2. © 2021 RAKSUL, inc. All rights reserved. 社外秘 Confidential 3

    https://techblog.raksul.com/ RAKSUL TechBlog 社員インタビュー https://recruit.raksul.com/story/archives/engineer/ RAKSUL Engineer Recruitment Book https://raksulinc.notion.site/RAKSUL-Engineer-Recruit ment-Book-a1245092c4434b45b162a9fe277c169f RAKSUL 公式connpass https://raksul.connpass.com/ https://www.youtube.com/channel/UCyihWcvrHmE e-edcqdcJFsQ/ RAKSUL 公式YouTube RAKSUL 公式X https://twitter.com/raksuldev RAKSUL をもっと詳しく
  3. @ 2024 Novasell, Inc. All Rights Reserved. 4 Pythonのオブジェクトの構成 id

    …メモリアドレス class …タイプ refcount …GCで使われるもの その他 value などなど refcount …GCで使われるもの すべてのオブジェクトは参照カウント(refcount)等を持っている Advanced Python Mastery (course by @dabeaz) 2-48
  4. @ 2024 Novasell, Inc. All Rights Reserved. 5 Python(標準実装のCPython)の参照カウントとは GCの⼀種で、プログラム内のオブジェクトがいくつの強い参照を持つかを追跡

    参照カウント - python.jp カウントが0になる(不要になる)と、CやC++のように明⽰的にメモリを解放しなくても⾃動的に解放
  5. @ 2024 Novasell, Inc. All Rights Reserved. 6 参照カウントの基本的な役割 オブジェクトの⽣存期間を管理し、不要になったメモリを効率的に解放

    オブジェクト作成 Pythonでオブジェクトが作成されると、参照カウントは1になる 参照の追加‧削除 オブジェクトへの参照が増減するたびに、参照カウントもそれに応じて増減 参照カウントの監視 参照カウントが0になると、Pythonはそのオブジェクトを使⽤されていないと判断 メモリの解放 参照カウントが0のオブジェクトはメモリから解放され、その領域が再利⽤可能 連鎖的解放 オブジェクトが解放されると、それが参照した他のオブジェクトの参照カウントも減少し、連鎖的に解放 はじめに. オブジェクト、型および参照カウント — Python 3.10.13 ドキュメント
  6. @ 2024 Novasell, Inc. All Rights Reserved. 7 参考: 参照カウントの操作(CPython)

    はじめに. オブジェクト、型および参照カウント — Python 3.10.13 ドキュメント
  7. @ 2024 Novasell, Inc. All Rights Reserved. 8 Pythonの参照カウントの位置付け Pythonのメモリ管理

    • ガベージコレクション (GC) • 参照カウント i. 概念: Pythonは各オブジェクトに対して参照数を追跡 ii. 効果: 参照が0になると、オブジェクトは⾃動的にメモリから削除 • Generational GC (世代別ガベージコレクション) • メモリプール • オブジェクト特有のアロケータ • 動的メモリ管理 • アロケータのカスタマイズ
  8. @ 2024 Novasell, Inc. All Rights Reserved. 9 Generational GC

    (世代別ガベージコレクション) Python Garbage Collection: What It Is and How It Works Generational GCの基本的な概念 • オブジェクトは作成されてからの経過時間に応じて「世代」に分類 • 新しいオブジェクトは「若い世代」に、時間が経つにつれて「古い世代」に移動 • 古い世代のオブジェクトは、ガベージコレクションのチェック頻度が低くなる
  9. @ 2024 Novasell, Inc. All Rights Reserved. 10 Generational GC

    (世代別ガベージコレクション) 循環参照とは • 循環参照は、2つ以上のオブジェクトが互いに参照し合う状態を指す • このようなオブジェクト群は、参照カウントが0にならないため、 参照カウントによるGCでは解放されない Python Garbage Collection: What It Is and How It Works
  10. @ 2024 Novasell, Inc. All Rights Reserved. 11 Generational GC

    (世代別ガベージコレクション) Generational GCの効果 • 循環参照を含むオブジェクト群を検出し、メモリから解放する     これにより、メモリリークのリスクを減らし、全体的なメモリ効率が向上 Python Garbage Collection: What It Is and How It Works
  11. @ 2024 Novasell, Inc. All Rights Reserved. 12 Generational GC

    (世代別ガベージコレクション)
  12. @ 2024 Novasell, Inc. All Rights Reserved. 14 他の⾔語のメモリ(オブジェクト)管理: JavaScript

    設計⽅針: 到達可能性 • 基本概念 • オブジェクトの⽣存は、その「到達可能性」によって決定される • 「到達可能」オブジェクトは、直接または間接的に参照されているオブジェクトを指す • 到達可能性の例 • グローバル変数や実⾏中の関数のローカル変数によって参照されるオブジェクトは「到達可能」 • これらのオブジェクトが他のオブジェクトを参照する場合、参照されたオブジェクトも「到達可能」 Memory management - JavaScript | MDN
  13. @ 2024 Novasell, Inc. All Rights Reserved. 15 他の⾔語のメモリ(オブジェクト)管理: JavaScript

    到達可能性の実装: (GC)の⼀種である「マーク‧アンド‧スイープ」アルゴリズム • マークフェーズ: マーキング • ガベージコレクタが⾃動的にルート集合(グローバル変数など)から開始し、                       到達可能なオブジェクトにマークを付ける • スイープフェーズ: メモリ解放 • マークされていないオブジェクト(到達不可能なオブジェクト)は⾃動的にメモリから削除 Memory management - JavaScript | MDN
  14. @ 2024 Novasell, Inc. All Rights Reserved. 17 他の⾔語のメモリ(オブジェクト)管理: Rust

    アナロジー的には、Rustは基本的に参照カウントが1以外を許さない言語設計。           各値が一つの変数に「所有される」という原則に基づく。 所有権 (Ownership) • 各値は⼀つの変数に「所有」される • 所有権は代⼊や関数呼び出しで移動する • 値の所有者がスコープを抜けると、値は⾃動的に破棄される 借⽤ (Borrowing) • 他の変数から値を「借⽤」して参照する • 不変の借⽤(&T)では値を変更できず、複数同時に存在可能 • 可変の借⽤(&mut T)では値を変更でき、⼀度に⼀つのみ存在
  15. @ 2024 Novasell, Inc. All Rights Reserved. 18 他の⾔語のメモリ(オブジェクト)管理: Rust

    内部的な動作 • コンパイル時のチェック ◦ Rustのコンパイラはコードをコンパイルする際に、       所有権のルールに基づいてメモリ安全性をチェックする • ⾃動的なリソース解放 ◦ 所有者のスコープが終了すると、 Rustコンパイラは⾃動的にリソースを解放するコードを挿⼊する
  16. @ 2024 Novasell, Inc. All Rights Reserved. 21 参考 •

    Advanced Python Mastery • 参照カウント - python.jp • はじめに — Python 3.10.13 ドキュメント • デザインと歴史 FAQ • Python Garbage Collection: What It Is and How It Works • Memory management - JavaScript | MDN • Rustのメモリ管理って⾯⽩い • What is Ownership? - The Rust Programming Language