Python がメモリを管理する方法

silencement
silencementオリジナル
2019-06-11 17:07:303297ブラウズ

Python がメモリを管理する方法

Python では、メモリを管理するための参照カウントというメカニズムが導入されています。

Python は内部で参照カウントを使用して、メモリ内のオブジェクトを追跡します。Python は、オブジェクトが持つ参照の数、つまり参照カウントを内部的に記録します。オブジェクトが作成されると、参照カウントが作成されます。オブジェクトはもう必要ありません。必要な場合、このオブジェクトの参照カウントは 0 になり、ガベージ コレクションされます。

要約すると、次の状況では、オブジェクトの参照カウントが 1 増加します:

1. オブジェクトが作成されます: x=4

2. その他 その他が作成されます: y=x

3. パラメータとして関数に渡されます: foo(x)

4. コンテナ オブジェクトの要素として: a=[ 1,x,'33' ]

参照カウント削減の状況

1. ローカル参照はスコープを離れます。たとえば、上記の foo(x) 関数が終了すると、x が指すオブジェクト参照は 1 だけ減らされます。

2. オブジェクトのエイリアスは明示的に破棄されます: del x; または del y

3. オブジェクトのエイリアスが別のオブジェクトに割り当てられます: x=789

4. オブジェクトがウィンドウ オブジェクトから削除されます: myList.remove(x)

5. ウィンドウ オブジェクト自体が破棄されます: del myList、またはウィンドウ オブジェクト自体がスコープを離れます。

ガベージ コレクション

1. メモリに使用されなくなった部分がある場合、ガベージ コレクターはそれらをクリーンアップします。参照カウントが 0 のオブジェクトをチェックし、メモリ内のスペースをクリアします。もちろん、参照カウント 0 がクリアされることに加えて、ガベージ コレクターによってクリアされる別の状況もあります。つまり、2 つのオブジェクトが相互に参照するとき、それらの他の参照はすでに 0 になっています。

2. ガベージ コレクション メカニズムには、循環参照オブジェクトが確実に解放されるようにするための循環ガベージ コレクターもあります (a は b を参照し、b は a を参照するため、参照カウントが 0 になることはありません)。

Python では、多くの場合、適用されるメモリは小さなメモリ ブロックです。これらの小さなメモリ ブロックは、適用後すぐに解放されます。これらのメモリ アプリケーションはオブジェクトを作成するためのものではないため、オブジェクトはありません-レベルのメモリプールメカニズム。これは、Python が動作中に多数の malloc および free 操作を実行し、ユーザー モードとコア モードを頻繁に切り替えることを意味し、Python の実行効率に重大な影響を与えます。 Python の実行効率を高速化するために、Python ではアプリケーションと小さなメモリ ブロックの解放を管理するメモリ プール メカニズムが導入されています。

メモリ プール メカニズム

Python はメモリのガベージ コレクション メカニズムを提供しますが、未使用のメモリはオペレーティング システムに返すのではなく、メモリ プールに入れられます。

Python の 256 バイト未満のすべてのオブジェクトは pymalloc によって実装されたアロケーターを使用しますが、大きなオブジェクトはシステムの malloc を使用します。さらに、整数、浮動小数点数、リストなどの Python オブジェクトには独自の独立したプライベート メモリ プールがあり、そのメモリ プールはオブジェクト間で共有されません。これは、多数の整数を割り当てて解放すると、これらの整数のキャッシュに使用されるメモリを浮動小数点数に割り当てることができなくなることを意味します。

以上がPython がメモリを管理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。