ホームページ > バックエンド開発 > Python チュートリアル > Python が一部の整数をキャッシュし、他の整数をキャッシュしないのはなぜですか?

Python が一部の整数をキャッシュし、他の整数をキャッシュしないのはなぜですか?

Patricia Arquette
リリース: 2024-12-25 17:22:09
オリジナル
618 人が閲覧しました

Why Does Python Cache Some Integers But Not Others?

インタプリタによって維持される整数キャッシュとは何ですか?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート