インタプリタによって維持される整数キャッシュとは何ですか?
Python は、同じコード オブジェクトにコンパイルするときに同一のリテラルを最適化し、結果としてオブジェクトが生成されます。同じアイデンティティを持っていること。通常、[-5, 256] の範囲内の整数がキャッシュされますが、この範囲内のすべての整数が同じ ID を持つことは保証されません。
提供したコード例では、各行を実行するときにPython シェルで個別に:
>>> a = 1 >>> b = 1 >>> a is b True
コードは行ごとに個別に解析され、コンパイルされます。ただし、ファイル内で同じコードを一緒に実行する場合:
>>> a = 257; b = 257; a is b True
コンパイラはリテラルを最適化できます。コンパイル プロセス中に、AST はバイトコードに変換され、コンパイラーはリテラルの使用状況を分析して重複を回避します。これにより、コンパイルされたコード内の整数 257 に対して単一の定数が生成されます。
この最適化は、整数に限定されず、浮動小数点などの他のリテラルにも適用されます。ただし、タプルのようなより複雑なリテラルでは機能しません。タプル内のリテラルは個別に最適化されます。
2 つの PyInt_Object が作成されているのが観察された理由は、リテラルを整数に変換するパーサーのアプローチによるものと考えられます。 。パーサーは、リテラルを整数値に変換する関数を使用してから、PyLong_FromString を呼び出して整数オブジェクトを作成します。このアプローチにより、変換コードの書き換えが回避され、簡単な拡張が可能になります。
ただし、等しい定数が同じオブジェクトを使用するようにするための最終的な最適化は、AST 変換中ではなく、バイトコードのコンパイル中に行われます。具体的には、compiler_add_o 関数は定数をディクショナリ オブジェクトに格納する役割を果たし、その結果、同一の定数が同じスロットに分類され、最終的なバイトコードでは単一の定数で表されます。
以上がPython が一部の整数をキャッシュし、他の整数をキャッシュしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。