タイトル
7 Python オブジェクト モデル
8 PyObject と PyVarObject
9 参照カウント
10 ガベージコレクター
11 メモリ アロケータ
12 オブジェクトのレイアウトとタイプ スロット
13 組み込みオブジェクトの実装
14 文字列、バイト、Unicode
15 リスト、タプル、配列
16 辞書とセット
17 整数、浮動小数点数、複素数
  • 7. Python オブジェクト モデル

    #7. Python オブジェクト モデル Python オブジェクト モデルは CPython の基礎です。 Python で実行されるものはすべて、整数、文字列、リスト、モジュール、関数、クラス、例外、フレーム、さらにはコンパイルされたコードなど、最終的にはオブジェクトに対する操作になります。 言語レベルでは、Python はすべてのオブジェクトに ID、型、および値があると言います。オブジェクトのアイデンティティは作成後も固定されます。 is アイデンティティを比較し、 id() その ID を表す整数を返します。 ([Python ドキュメント][1]) CPython は、C 構造体、オブジェクト ヘッダー、参照カウント、型オブジェクト、および操作スロットを使用してこのモデルを実装します。 7.1 オブジェクト、値、およびアイデンティティ Python オブジェクトには 3 つのコア プロパティがあります。 プロパティ 意味 例 アイデンティティ オブジェクトの安定したアイデンティティ id(x) タイプ オブジェクトのランタイムタイプ type(x) 値 オブジェクト によって表されるデータ 42 、 "abc" 、 [1, 2] 例:```python x = [1, 2, 3] y = x print(x is y) # True print(type(x)) # <class 'list'> print(x)…

  • 8. PyObject と PyVarObject

    #8。 PyObject そして PyVarObject PyObject そして PyVarObject は、CPython オブジェクトの背後にある基本レイアウトです。これらは Python クラスではありません。これらは、ランタイムが共通のポインター型を通じて多くの異なるオブジェクト実装を処理できるようにする C レベルの構造体規則です。 実行時、CPython のほとんどのオブジェクト参照は次のように表されます。```c PyObject * ## 8.1 共通オブジェクトヘッダー 簡略化された ` PyObject ` 次のようになります : ``` c typedef struct { Py_ssize_t ob_refcnt ; PyTypeObject * ob_type ; } PyObject ; ``` 実際の定義では、特にデバッグ ビルド、トレース ビルド、および最新の CPython バージョンで、マクロとビルド依存フィールドが使用されます。しかし、本質的なアイデアは安定しています。 ``` text PyObject reference count type pointer ``` 参照カウントは所有権を追跡します。 型ポインタは、オブジェクトがどのように動作するかを CPython に伝えます。 通常の CPython オブジェクトはすべて、この共通ヘッダーで始まります。そのため、ランタイムは ` PyObject *` コンパイル時に完全な具体的な構造体を知らなくても、その型を検査できます。 ## 8.2 すべてのオブジェクトが同じように始まる理由 次の…

  • 9. 参照カウント

    #9. 参照カウント 参照カウントは、CPython の主要なメモリ管理メカニズムです。すべての通常のオブジェクトには、現在そのオブジェクトを指している強参照の数が含まれています。このカウントがゼロになると、CPython はオブジェクトを即座に破棄できます。 この設計は、CPython と他の多くの言語ランタイムの最も明確な違いの 1 つです。 CPython には循環ガベージ コレクターがありますが、コレクターは参照カウントを補います。ほとんどのオブジェクトは、定期的なトレースではなく、参照カウントの遷移によって再利用されます。 9.1 核となるアイデア Python オブジェクトは、何かがそのオブジェクトへの参照を所有している間は生き続けます。 概念的には:```text object created reference count = 1 another owner stores the object reference count += 1 an owner releases the object reference count -= 1 reference count reaches 0 object is deallocated 例: python x = [] y = x del x del y ```リスト オブジェクトが作成され、バインドされます。 x 。バインディング y = x 同じリストへの別の参照を作成します。削除中 x 参照を…

  • 10. ガベージコレクター

    #10. ガベージコレクター CPython は、メインのメモリ管理メカニズムとして参照カウントを使用します。参照カウントでは、ほとんどのオブジェクトは、最後の強い参照が消えるとすぐに破棄されます。 参照カウントには大きな制限が 1 つあります。それは、参照サイクルを単独で再利用できないことです。 ガベージ コレクターは、コンテナ オブジェクトの到達不能なサイクルを見つけて再利用するために存在します。これは参照カウントを補足するものであり、それに代わるものではありません。 10.1 参照カウントにヘルプが必要な理由 参照カウントがゼロになるのは、オブジェクトを指す強参照がない場合のみです。 これは通常のオブジェクト グラフで機能します。```python x = [] del x サイクルでは機能しません。 ``` python a = [] b = [] a . append ( b ) b . append ( a ) del a del b ``` 2 つの名前が削除された後も、リストは引き続き相互参照します。 ``` text list A ---> list B list B ---> list A ``` それらの参照カウントはゼロ以外のままです。しかし、ライブ Python コードはそれらに到達できません。 参照カウントではローカル所有権が確認されます。ガベージ コレクションでは到達可能性が確認されます。 ## 10.2 ガベージコレクターが追跡するもの CPython…

  • 11. メモリ アロケータ

    #11. メモリアロケータ CPython はメモリを常に割り当てます。すべての整数オブジェクト、リスト オブジェクト、フレーム、タプル、辞書エントリ配列、文字列バッファ、コード オブジェクト、例外、モジュール、関数にはメモリが必要です。アロケータ システムは、これらの割り当てを高速かつ構造化し、デバッグ可能にし、プラットフォーム間で移植できるようにするために存在します。 CPython はアロケーターを 1 つだけ使用するわけではありません。複数のアロケーター ドメインとレイヤーを使用します。小さな Python オブジェクトは、CPython の特殊な小さなオブジェクト アロケーターを通過することがよくありますが、より大きなバッファーはプラットフォーム アロケーターを通過する場合があります。 11.1 CPython が独自のアロケータを持つ理由 Python プログラムは、有効期間の短いオブジェクトを多数作成します。 python for i in range(1_000_000): x = (i, i + 1) このループは、多くのタプル オブジェクトと整数参照を割り当てます。すべての小さなオブジェクトの割り当てがシステムに直接行われる場合 malloc 、オーバーヘッドが高くなります。 CPython のアロケーター システムは、次のようにしてこれを改善します。```text serving small object allocations quickly grouping small allocations into arenas and pools reducing calls into the platform allocator supporting debug hooks separating allocator domains making object allocation behavior predictable enough…

  • 12. オブジェクトのレイアウトとタイプ スロット

    12. オブジェクトのレイアウトとタイプ スロット CPython は、すべてのランタイム値をオブジェクトとして表します。各オブジェクトにはメモリ レイアウトがあり、各オブジェクトのタイプはそのメモリがどのように解釈されるべきかを記述します。 オブジェクトのレイアウトは次のように答えます。 text What fields exist inside this object? Where are the references to other Python objects? How large is one instance? Does the object have variable-sized trailing storage? Does the object participate in cyclic garbage collection? タイプ スロットの答えは次のとおりです。```text How is this object called? How is it deallocated? How does attribute lookup work? How does indexing work? How does addition work? How does iteration work?…

  • 13. 組み込みオブジェクトの実装

    #13. 組み込みオブジェクトの実装 組み込みオブジェクトは、Python のコア型の背後にある具体的なデータ構造です。これらは、ID、型、参照カウント、サポートされている場合は属性、および型スロットによって定義された動作を持つという意味では、通常の Python オブジェクトです。これらは、ストレージと操作が C で直接実装されているため、特別です。 この章では大まかな地図を示します。後の章では、文字列、リスト、タプル、辞書、セット、数値、関数、モジュール、およびフレームについてさらに詳しく説明します。 13.1 組み込みは型オブジェクトです などの内蔵タイプ list 、 dict 、 または int それ自体は Python オブジェクトです。 python print(type(list)) # <class 'type'> print(type(dict)) # <class 'type'> print(type(int)) # <class 'type'> インスタンスはその型オブジェクトを指します。 python xs = [1, 2, 3] print(type(xs)) # <class 'list'> C レベルでは:```text xs ---> PyListObject ob_refcnt ob_type ----> PyList_Type ob_size ob_item allocated ## 13.2 組み込みが C で実装される理由 組み込み型は、 Python 実行の最もホットなパスにあります。 一般的な操作は次のとおりです。 ``` text integer arithmetic…

  • 14. 文字列、バイト、Unicode

    #14. 文字列、バイト、Unicode テキスト データとバイナリ データは、Python では別個のオブジェクト ファミリです。 str Unicode テキストを表します。 bytes 不変のバイナリデータを表します。 bytearray 可変バイナリデータを表します。 This separation is one of Python 3’s most important runtime design choices.テキストには文字とエンコーディングがあります。 Binary data has bytes. CPython implements these concepts with different object layouts, APIs, and invariants. 14.1 テキスト データとバイナリ データ A string is text: python id="ly45du" s = "hello" バイト オブジェクトはバイナリ データです。 python id="1wh8hi" b = b"hello" ASCII コンテンツでは似ているように見えますが、タイプは異なります。 python id="iqtxra" print(type("hello")) # <class 'str'>…

  • 15. リスト、タプル、配列

    #15. リスト、タプル、配列 リスト、タプル、および配列のようなオブジェクトは、順序付けられたコレクションを表します。これらはすべてインデックス付きアクセスをサポートしていますが、ストレージ モデル、可変性ルール、パフォーマンスのトレードオフが異なります。 リストは、オブジェクト参照の変更可能なシーケンスです。 タプルは、オブジェクト参照の不変のシーケンスです。 配列のようなオブジェクトは、コンパクトな型付きデータを格納するか、連続したバッファを公開します。 CPython コンテナーは、その型が RAW ストレージ用に特別に設計されていない限り、参照を格納するため、これらの区別は重要です。 15.1 順序付けられたコレクション Python にはいくつかの順序付きコレクション型があります。 タイプ 可変 店舗 主な用途 list はい オブジェクト参照 一般的な可変シーケンス tuple いいえ オブジェクト参照 固定レコード、不変グループ array.array はい 生の型付き値 コンパクトな数値ストレージ bytes いいえ 生のバイト 不変バイナリデータ bytearray はい 生のバイト 変更可能なバイナリ データ memoryview ビューに依存 生のバッファビュー ゼロコピーバッファアクセス リストとタプルには、あらゆるタイプのオブジェクトを格納できます。 python xs = [1, "two", object()] t = (1, "two", object()) 配列には、1 つのマシンレベルの型の値が格納されます。```python from array import array nums = array("i", [1, 2, 3]) CPython リストには、…

  • 16. 辞書とセット

    #16. 辞書とセット ディクショナリとセットは、CPython の主要なハッシュ テーブル コンテナです。辞書はキーを値にマッピングします。セットには、値が関連付けられていないキーが格納されます。 これらは Python のあらゆる場所で使用されます。```text id="cp7dx7" module globals class namespaces instance attributes keyword arguments function annotations import caches memoization tables membership indexes deduplication sets ## 16.1 辞書の意味論 辞書はハッシュ可能なキーを値にマッピングします 。``` python id = "cvrlq9" d = { "name" : "Ada" , "age" : 36 , } print ( d [ "name" ]) # Ada ``` キーはハッシュ可能である必要があります 。 値には任意のオブジェクトを指定できます 。``` python id = "mb4tqx" d = {} d…

  • 17. 整数、浮動小数点数、複素数

    #17. 整数、浮動小数点、および複素数 Python の数値オブジェクトは、特殊な実装を備えた通常のオブジェクトです。これらは、リスト、辞書、関数、クラス、モジュールと同じオブジェクト モデルに参加します。各値には、オブジェクト ヘッダー、型ポインター、参照カウント動作、および操作用の型スロットがあります。 主な組み込み数値型は次のとおりです。 タイプ Python 名 主な表現 整数 int 任意精度の整数 ブール値 bool のシングルトンサブクラス int 浮動小数点 float Cダブル 複雑な complex C ダブルスのペア これらの型は Python レベルでは単純に見えますが、それぞれに実行時の重要なトレードオフがあります。 17.1 数値オブジェクトはオブジェクトである Python 整数は、通常、生の CPU 整数として Python 変数に格納されません。 python x = 42 CPython レベルでは、 x Python 整数オブジェクトを指します。 概念的には: text x ---> PyLongObject object header integer payload 浮動小数点数と複素数についても同様です。 python a = 1.5 b = 1 + 2j 概念的には:```text a ---> PyFloatObject object header…