20

さて、私は、他のクラスが基本としてクラスをインポートできるようにするクラスの概念を理解しましたが、それを使用する場合はインポートする必要があります。どうすれば実装できますか?それとも、Python インタープリターはすでに何らかの方法でこれを行っていますか? 使用されていないクラスをメモリから破棄しますか?

C++/C がポインターなどを使用して非常にメモリ指向であることは知っていますが、Python ですか? それに問題があると言っているわけではありません。多かれ少なかれ、プログラムの設計のために変更を加えたいと思っています。何百ものクラスとモジュールを使用する大規模なプログラムを作成したいと考えています。しかし、Python がメモリ管理を処理する方法を理解していないため、これを行うとアプリケーションが停止するのではないかと心配しています。

漠然とした質問であることは承知していますが、誰かが私を正しい方向にリンクまたは指摘してくれれば、それは大歓迎です。

4

5 に答える 5

26

Python は、C#、Java、Perl、Ruby、Lua、および他の多くの言語と同様に、手動のメモリ管理ではなくガベージ コレクションを使用します。オブジェクトを自由に作成するだけで、言語のメモリ マネージャーは定期的に (または具体的に指示したときに)、プログラムによって参照されなくなったオブジェクトを探します。

したがって、オブジェクトを保持したい場合は、そのオブジェクトへの参照を保持するだけです。オブジェクトを(最終的に)解放したい場合は、そのオブジェクトへの参照をすべて削除してください。

def foo(names):
  for name in names:
    print name

foo(["Eric", "Ernie", "Bert"])
foo(["Guthtrie", "Eddie", "Al"])

これらの各呼び出しは、3 つの値で初期化されfooた Pythonlistオブジェクトを作成します。foo呼び出しの間、変数は変数によって参照されますnamesが、その関数が終了するとすぐに、それらへの参照を保持している変数はなく、ガベージ コレクターが削除するのは公正なゲームです。

于 2012-07-21T22:40:57.367 に答える
7

Python メモリ管理に関する次の記事を読んでください。

Python : メモリ管理(バージョン 3 に更新)

抜粋: (例は記事にあります):

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

最下位レベルでは、未加工のメモリ アロケータが、オペレーティング システムのメモリ マネージャとやり取りすることで、すべての Python 関連データを格納するための十分なスペースをプライベート ヒープに確保します。raw メモリ アロケータの上に、いくつかのオブジェクト固有のアロケータが同じヒープ上で動作し、すべてのオブジェクト タイプの特性に適合する個別のメモリ管理ポリシーを実装します。たとえば、整数オブジェクトは、ヒープ内で文字列、タプル、または辞書とは異なる方法で管理されます。これは、整数が異なるストレージ要件と速度/スペースのトレードオフを意味するためです。したがって、Python メモリ マネージャーは、作業の一部をオブジェクト固有のアロケーターに委任しますが、後者がプライベート ヒープの境界内で動作することを保証します。

Python ヒープの管理はインタープリター自体によって実行され、ユーザーがそのヒープ内のメモリ ブロックへのオブジェクト ポインターを定期的に操作したとしても、それを制御できないことを理解することが重要です。Python オブジェクトおよびその他の内部バッファーのヒープ領域の割り当ては、このドキュメントに記載されている Python/C API 関数を介して、Python メモリ マネージャーによってオンデマンドで実行されます。

于 2012-07-21T22:38:44.550 に答える
3

私の5セント:

  1. 最も重要なことは、Python は参照されたオブジェクトに対してのみメモリを解放することです (クラスはコンテナーまたはカスタム データ型であるため、クラスに対しては解放しません)。繰り返しますが、Python ではすべてがオブジェクトなので、int、float、string、[]、{}、および () はすべてオブジェクトです。つまり、プログラムがそれらを参照しなくなった場合、それらはガベージ コレクションの犠牲者になります。

  2. Pythonは「参照カウント」と「GC」を使用してメモリを解放しますが(使用されていないオブジェクトの場合)、この空きメモリはオペレーティングシステムに返されません(Windowsではケースが異なります)。これは、空きメモリ チャンクがオペレーティング システムではなく Python インタープリターに戻ることを意味します。したがって、最終的にあなたの python プロセスは同じメモリを保持することになります。ただし、Python はこのメモリを使用して他のオブジェクトに割り当てます。

これについての非常に良い説明: http://deeplearning.net/software/theano/tutorial/python-memory-management.html

于 2016-04-11T04:27:18.793 に答える