web-dev-qa-db-ja.com

Pythonにはスタック/ヒープがあり、メモリはどのように管理されていますか?

Pythonでは変数とメモリはどのように管理されますか?スタックとヒープがあり、メモリを管理するためにどのアルゴリズムが使用されていますか?この知識があれば、大量/データの処理のためのメモリ管理に関する推奨事項はありますか?

77
Matt Alcock

Pythonでの変数とメモリの管理方法。

魔法のように!いいえ、実際には、オブジェクトを作成するだけで、Python仮想マシンが必要なメモリを処理し、メモリレイアウトのどこに配置するかを指定します。

スタックとヒープがあり、メモリを管理するためにどのアルゴリズムが使用されていますか?

CPythonについて話しているとき、オブジェクトを格納するためにprivate heapを使用します。 CPython C APIドキュメントから

Pythonのメモリ管理には、すべてのPythonオブジェクトとデータ構造を含むプライベートヒープが含まれます。このプライベートヒープの管理は、PythonメモリマネージャーPython=メモリマネージャーには、共有、セグメンテーション、事前割り当て、キャッシュなどのさまざまな動的ストレージ管理の側面を処理するさまざまなコンポーネントがあります。

メモリの再利用は、主に参照カウントによって処理されます。つまり、Python VMは、オブジェクトを参照する参照の数の内部ジャーナルを保持し、参照する参照がなくなったときに自動的にガベージコレクションを行います。さらに、 循環参照を解除するメカニズム (参照カウントが処理できない)オブジェクトの到達不能な「島」を検出することにより、 従来のGCアルゴリズムの逆 すべての到達可能なオブジェクトを見つけようとします。

注:この情報はCPython固有であることに注意してください。他のpython実装、たとえばpypyiron pythonjythonなどは、実装の仕様に関しては互いに異なる場合があります。よりよく理解するために、Pythonセマンティクス(言語)と基礎となる実装の間に違いがあることを理解するのに役立つかもしれません

この知識があれば、大量/データの処理のためのメモリ管理に関する推奨事項はありますか?

今私はこれについて話すことはできませんが、 NumPy (最も人気のあるpython数値演算用のライブラリ)はメモリ消費を適切に処理するメカニズムを持っていると確信しています。

Pythonの内部構造について詳しく知りたい場合は、次のリソースをご覧ください。

98
NlightNFotis

Pythonにはanyそのようなものはありません。

Pythonは言語であり、実装がPython =言語。

すべての実装(CPython、PyPy、IronPython、Stackless、Jython ...)は独自の処理を自由に行うことができます!

に CPython、allオブジェクトはヒープ上に存在します:

Python=のメモリ管理には、すべてのPythonオブジェクトとデータ構造を含むプライベートヒープが含まれます。1

CPython仮想マシンはスタックベースです:

>>> def g():
    x = 1
    y = 2
    return f(x, y)

>>> import dis
>>> dis.dis(g)
  2           0 LOAD_CONST           1 (1) # Push 1 onto the stack
              3 STORE_FAST           0 (x) # Stores top of stack into local var x

  3           6 LOAD_CONST           2 (2) # Push 2 onto stack
              9 STORE_FAST           1 (y) # Store TOS into local var y

  4          12 LOAD_GLOBAL          0 (f) # Push f onto stack
             15 LOAD_FAST            0 (x) # Push x onto stack
             18 LOAD_FAST            1 (y) # Push y onto stack
             21 CALL_FUNCTION        2     # Execute function with 2 
                                           # f's return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

これはCPython固有であることに注意してください。スタックにはactual値は含まれませんが、それらのオブジェクトへの参照は保持されます。

1Source

43
phant0m