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

めぐろLT_ Pythonの弱参照(weakref)を使えば、世界はもっと良くなる

Yusuke Tamura
September 29, 2023
500

めぐろLT_ Pythonの弱参照(weakref)を使えば、世界はもっと良くなる

2023/09/23 めぐろLT登壇

Yusuke Tamura

September 29, 2023
Tweet

Transcript

  1. @ 2023 Novasell, Inc. All Rights Reserved. 自己紹介 GitHub: @tamtam-fitness,

    X: @TamtamFitness, Zenn: Tamtam たむたむ(tamtam)といいます! ラクスル/ノバセルの新卒2年⽬です💪 FastAPIの翻訳/記事の執筆を定期的にしてます🐍
  2. @ 2023 Novasell, Inc. All Rights Reserved. 4 Pythonのオブジェクトの構成 id

    …メモリアドレス class …タイプ refcount …GCで使われるもの その他 value などなど refcount …GCで使われるもの すべてのオブジェクトは参照カウント(refcount)等を持っている Advanced Python Mastery (course by @dabeaz) 2-48
  3. @ 2023 Novasell, Inc. All Rights Reserved. 5 Pythonの参照カウント オブジェクトはすべて「⾃⾝が他のいくつの変数から参照されているか」をカウント

    参照カウント - python.jp カウントが0になる(不要になる)と、CやC++のように明⽰的にメモリを解放しなくても⾃動的に解放
  4. @ 2023 Novasell, Inc. All Rights Reserved. 6 参照元を消しても参照先が削除されないのは      

    参照カウントが0にならないから delはオブジェクトを削除するのではなく、変数とオブジェクトのバインディング(参照)を削除。 変数piはオブジェクトへの参照を失うが、そのオブジェクト⾃体はまだメモリ上に存在。 変数copied_piは同じオブジェクトを参照しているため、そのオブジェクトの参照カウントは0にはならず、メモリ上に残る。
  5. @ 2023 Novasell, Inc. All Rights Reserved. 8 Pythonの弱参照(weakref) 参照カウントを増やさないオブジェクトへの参照

    weakref --- 弱参照 — Python 3.10.12 ドキュメント ※ 弱参照をサポートしている型...ユーザー定義型‧サブクラス化したリスト/辞書
  6. @ 2023 Novasell, Inc. All Rights Reserved. 9 弱参照(weakref)のユースケース 引⽤:

    weakref --- 弱参照 — Python 3.10.12 ドキュメント 弱参照の主な⽤途は、巨⼤なオブジェクトを保持するキャッシュやマッピングを実装することです。ここで、キャッシュ やマッピングに保持されているからという理由だけで、巨⼤なオブジェクトが⽣き続けることは望ましくありません。 引⽤: Advanced Python Mastery (course by @dabeaz) 3-64 Weak references are sometimes used where there are reference cycles between objects . Example : graphs, trees, observers, caches,etc. Not something you should consider unless dealing with really tricky memory problems . オブジェクト間に参照サイクルがある場合、弱参照が使われることがあります。 例:グラフ、ツリー、オブザーバー、キャッシュなど。 よほどトリッキーなメモリ問題を扱わない限り、弱参照の利⽤を検討する必要はないです。 オブジェクトへの参照を持ちつつも、そのオブジェクトの存続に影響を与えないようにしたい! - キャッシュ: キャッシュとして保持し、必要なくなったら⾃動的にGCしたい - 巨⼤なオブジェクトの⼀部参照: 部分的に弱参照し、GCの妨げにならないようにしたい
  7. @ 2023 Novasell, Inc. All Rights Reserved. 10 弱参照(weakref)のユースケース例: キャッシュ

    画像のコード: https://gist.github.com/tamtam-fitness/3461f452ba8d2b8f2b6af6e1afc1ecd3 class weakref.WeakValueDictionary([dict]) を⽤いて、マッピングクラスの Value を弱参照にする weakref --- 弱参照 — Python 3.10.12 ドキュメント