私は遭遇しましたこの質問辞書のメモリ管理について、インターン機能。具体的には何をするもので、いつ使用されるのでしょうか?
例を挙げると:というセットがあったら見た重複をチェックするために使用する (string1,string2) 形式のタプルを含む場合、(intern(string1),intern(string2)) を保存すると、メモリまたは速度に関するパフォーマンスが向上しますか?
ベストアンサー1
からPython3 についてドキュメンテーション:
sys.intern(string)
文字列を「インターン化」された文字列のテーブルに入力し、インターン化された文字列 (文字列自体またはそのコピー) を返します。文字列をインターン化することは、辞書検索のパフォーマンスを少し向上させるのに役立ちます。辞書内のキーがインターン化され、検索キーがインターン化されている場合、キーの比較 (ハッシュ化後) は文字列比較ではなくポインタ比較によって実行できます。通常、Python プログラムで使用される名前は自動的にインターン化され、モジュール、クラス、またはインスタンスの属性を保持するために使用される辞書にはインターン化されたキーがあります。
インターンされた文字列は不滅ではありません。その恩恵を受けるには、intern() の戻り値への参照を保持する必要があります。
説明:
ドキュメントにあるように、このsys.intern
関数は次のような目的で使用されます。パフォーマンスの最適化。
このsys.intern
関数は、抑留された文字列。文字列をインターンしようとすると、関数はテーブル内で文字列を検索し、次の処理を実行します。
文字列が存在しない(まだインターンされていない)場合、関数はそれをテーブルに保存し、インターンされた文字列テーブルから返します。
>>> import sys >>> a = sys.intern('why do pangolins dream of quiche') >>> a 'why do pangolins dream of quiche'
上記の例では、
a
インターン化された文字列が保持されます。表示されてはいませんが、関数は文字列オブジェクトをインターン化された文字列テーブルにsys.intern
保存しています。'why do pangolins dream of quiche'
文字列が存在する場合(インターン化されている場合)、関数はインターン化された文字列テーブルからそれを返します。
>>> b = sys.intern('why do pangolins dream of quiche') >>> b 'why do pangolins dream of quiche'
すぐには表示されませんが、文字列は
'why do pangolins dream of quiche'
以前にインターンされているため、b
現在は と同じ文字列オブジェクトが保持されていますa
。>>> b is a True
intern を使用せずに同じ文字列を作成すると、同じ値を持つ 2 つの異なる文字列オブジェクトが作成されます。
>>> c = 'why do pangolins dream of quiche' >>> c is a False >>> c is b False
を使用することで、sys.intern
同じ値を持つ2つの文字列オブジェクトが作成されないようにすることができます。既存の文字列オブジェクトと同じ値を持つ2番目の文字列オブジェクトの作成を要求すると、既存の文字列オブジェクトへの参照が返されます。このようにして、メモリの節約また、文字列オブジェクトの比較は非常に効率的これは、2 つの文字列オブジェクトの内容ではなく、メモリ アドレスを比較することによって実行されるためです。