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


91

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


1
次の2つを読むと よい でしょ
2012/07/08

1
Pythonのvar /メモリ管理に問題があり、Pythonのドキュメントやグーグルで簡単に発見されない特定の問題はありますか?
マーティンジェームズ

回答:


111

Pythonでは変数とメモリはどのように管理されますか?

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

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

私たちが話しているとき、CPythonそれはオブジェクトを格納するためにプライベートヒープを使用します。CPython C APIドキュメントから

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

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

注:この情報はCPython特定のものであることに注意してください。以下のような他のPython実装、pypyiron pythonjythonそれは彼らの実装の詳細に来るとき他の人が互いからとCPythonとは異なる場合があります。それをよりよく理解するには、Pythonのセマンティクス(言語)と基礎となる実装の間に違いがあることを理解することが役立つ場合があります

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

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

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


5
PythonとCPythonの違いを強調しました;)
phant0m

1
ローカル変数には、スタックフレームに相当するものに実際の変数が格納されることに注意してください。
Marcin

1
PythonはJavaではありません。仮想マシンはありません。通訳がいます。これを指摘するのは見慣れないように見えるかもしれませんが、これらは2つの異なるパラダイムであり、その違いはコードのコンパイル方法と実行方法に重要な影響を与えます。stackoverflow.com/questions/441824/…–
Apollo2020

48

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

Pythonは言語であり、実装の正確な方法を指定していません、Pythonによって定義されたセマンティクスをが達成する必要がある。

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

ではC Pythonの、すべてのオブジェクトはヒープ上に住んでいます:

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固有のものであることに注意してください。スタックには実際の値は含まれていませんが、それらのオブジェクトへの参照は保持されます。

1ソース

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.