Python はどのような場合に同一の文字列に新しいメモリを割り当てますか?
同一の文字列に対する Python のメモリ割り当てのアプローチは、プログラマーの注意。ご覧のとおり、同一に見える文字列 (つまり a == b) はメモリ空間を共有する場合と共有しない場合があります (id(a) == id(b))。この動作は、Python 実装が文字列の割り当てを異なる方法で処理するという事実に起因しています。
各 Python 実装には、文字列などの不変オブジェクトをさまざまな方法で割り当てる柔軟性があります。そのような戦略の 1 つは、一意の文字列のキャッシュ (「Ucache」とも呼ばれる) を維持することです。この Ucache は、それぞれの一意の文字列の 1 つのコピーを保存することでメモリを節約する役割を果たします。新しい同一の文字列が見つかった場合、新しいオブジェクトを作成するのではなく、実装は単純に Ucache 内の既存のオブジェクトを参照する可能性があります。
ただし、ファイルから、または個別の関数間で文字列を割り当てる場合、実際には世界の実装では、異なる戦略が採用されることがよくあります。同一の既存オブジェクトを検索して識別することは、時間のかかる作業となる場合があります。このオーバーヘッドを回避するために、実装は既存のオブジェクトを見つけて再利用しようとするのではなく、新しいオブジェクトを作成することを選択する場合があります。
あなたの特定の例では、ファイルから州名のリストをロードしてそれを再度読み取ると、次の結果が得られます。メモリ消費量が大幅に増加します。これは、Python 実装がメモリ内にすでに存在する同一の文字列を識別して再利用しようとしていなかったためです。代わりに、文字列が同一であっても、文字列ごとに新しいオブジェクトが作成されました。
文字列割り当てに対する Python のアプローチは実装によって異なる可能性があることに注意することが重要です。実装によっては、より積極的なキャッシュ戦略を採用する場合もありますが、実装によってはメモリ節約よりも実行時のパフォーマンスを優先する場合もあります。同一の文字列により過剰なメモリが割り当てられていると思われる状況に遭遇した場合は、不変オブジェクトを管理し、メモリの肥大化の可能性を回避するために独自の「定数プール」メカニズムを実装することを検討できます。
以上がPython は同じ文字列に対するメモリ割り当てをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。