Python で変数とメモリはどのように管理されますか? スタックとヒープがあり、メモリを管理するためにどのアルゴリズムが使用されていますか? この知識を踏まえて、大量/データ処理のメモリ管理に関する推奨事項はありますか?
2 に答える
Python での変数とメモリの管理方法。
自動的に!いいえ、実際には、オブジェクトを作成するだけで、Python 仮想マシンが必要なメモリを処理し、メモリ レイアウト内のどこに配置する必要があります。
スタックとヒープがあり、メモリを管理するためにどのアルゴリズムが使用されていますか?
私たちが話しているときは、オブジェクトを格納するためにプライベート ヒープCPython
を使用します。CPython C API ドキュメントから:
Python でのメモリ管理には、すべての Python オブジェクトとデータ構造を含むプライベート ヒープが含まれます。このプライベート ヒープの管理は、Python メモリ マネージャーによって内部的に保証されます。Python メモリ マネージャーには、共有、セグメント化、事前割り当て、キャッシュなど、さまざまな動的ストレージ管理の側面を処理するさまざまなコンポーネントがあります。
メモリの再利用は、ほとんどの場合、参照カウントによって処理されます。つまり、Python VM はオブジェクトを参照する参照の数の内部ジャーナルを保持し、それを参照する参照がなくなると自動的にガベージ コレクションを行います。さらに、オブジェクトの到達不能な「島」を検出することにより、(参照カウントでは処理できない)循環参照を解除するメカニズムがあります。これは、到達可能なすべてのオブジェクトを見つけようとする従来の GC アルゴリズムとは少し逆です。
注:この情報はCPython
具体的なものであることに注意してください。pypy
、iron python
、その他の python 実装は、jython
実装の詳細に関しては、互いに異なる場合があり、CPython と異なる場合があります。それをよりよく理解するには、Python のセマンティクス (言語) と基礎となる実装との間に違いがあることを理解しておくと役立つ場合があります。
この知識を踏まえて、大量/データ処理のメモリ管理に関する推奨事項はありますか?
今はこれについて話すことはできませんが、NumPy (数値計算用の最も人気のある Python ライブラリ) には、メモリ消費を適切に処理するメカニズムがあると確信しています。
Python の内部について詳しく知りたい場合は、次のリソースをご覧ください。
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 :ソース