Slide 1

Slide 1 text

@ 2024 Novasell, Inc. All Rights Reserved. 参照カウントから⾒るPythonのメモリ管理 2024/01/25 みんなのPython勉強会#100 LT枠 ノバセル株式会社 ⽥村湧介(tamtam) 1

Slide 2

Slide 2 text

@ 2024 Novasell, Inc. All Rights Reserved. Introduction GitHub: @tamtam-fitness, X: @TamtamFitness, Zenn: Tamtam Tamtamといいます 💪 ラクスル (株) の新卒2年⽬のエンジニア📃📺 Pythonを⽤いたバックエンド開発や機械学習 および⽣成AIの経験をしてきました 🐍

Slide 3

Slide 3 text

© 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 をもっと詳しく

Slide 4

Slide 4 text

@ 2024 Novasell, Inc. All Rights Reserved. 4 Pythonのオブジェクトの構成 id …メモリアドレス class …タイプ refcount …GCで使われるもの その他 value などなど refcount …GCで使われるもの すべてのオブジェクトは参照カウント(refcount)等を持っている Advanced Python Mastery (course by @dabeaz) 2-48

Slide 5

Slide 5 text

@ 2024 Novasell, Inc. All Rights Reserved. 5 Python(標準実装のCPython)の参照カウントとは GCの⼀種で、プログラム内のオブジェクトがいくつの強い参照を持つかを追跡 参照カウント - python.jp カウントが0になる(不要になる)と、CやC++のように明⽰的にメモリを解放しなくても⾃動的に解放

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

@ 2024 Novasell, Inc. All Rights Reserved. 7 参考: 参照カウントの操作(CPython) はじめに. オブジェクト、型および参照カウント — Python 3.10.13 ドキュメント

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

@ 2024 Novasell, Inc. All Rights Reserved. 12 Generational GC (世代別ガベージコレクション)

Slide 13

Slide 13 text

@ 2024 Novasell, Inc. All Rights Reserved. 13 PythonのGCによるメモリ管理のPros / Cons

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

@ 2024 Novasell, Inc. All Rights Reserved. 16 JavaScriptのメモリ(オブジェクト)管理: Pythonとの⽐較

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

@ 2024 Novasell, Inc. All Rights Reserved. 18 他の⾔語のメモリ(オブジェクト)管理: Rust 内部的な動作 ● コンパイル時のチェック ○ Rustのコンパイラはコードをコンパイルする際に、       所有権のルールに基づいてメモリ安全性をチェックする ● ⾃動的なリソース解放 ○ 所有者のスコープが終了すると、 Rustコンパイラは⾃動的にリソースを解放するコードを挿⼊する

Slide 19

Slide 19 text

@ 2024 Novasell, Inc. All Rights Reserved. 19 Rustのメモリ(オブジェクト)管理: Pythonとの⽐較

Slide 20

Slide 20 text

@ 2024 Novasell, Inc. All Rights Reserved. 20 メモリ管理の⾔語別早⾒表(ざっくりしています)

Slide 21

Slide 21 text

@ 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

Slide 22

Slide 22 text

@ 2024 Novasell, Inc. All Rights Reserved. 22 Thank you for listening !