Heim >Backend-Entwicklung >Python-Tutorial >Warum speichert Python einige Ganzzahlen im Cache, andere jedoch nicht?

Warum speichert Python einige Ganzzahlen im Cache, andere jedoch nicht?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-25 17:22:09611Durchsuche

Why Does Python Cache Some Integers But Not Others?

Was ist mit dem vom Interpreter verwalteten Integer-Cache?

Python optimiert identische Literale, wenn sie in dasselbe Codeobjekt kompiliert werden, was zu Objekten führt die gleiche Identität haben. Normalerweise werden Ganzzahlen im Bereich [-5, 256] zwischengespeichert. Dies garantiert jedoch nicht, dass alle Ganzzahlen in diesem Bereich dieselbe Identität haben.

Im Beispielcode, den Sie angegeben haben, wenn Sie jede Zeile ausführen separat in der Python-Shell:

>>> a = 1
>>> b = 1
>>> a is b
True

Der Code wird für jede Zeile separat analysiert und kompiliert. Wenn Sie jedoch denselben Code zusammen in einer Datei ausführen:

>>> a = 257; b = 257; a is b
True

kann der Compiler die Literale optimieren. Während des Kompilierungsprozesses wird der AST in Bytecode umgewandelt und der Compiler analysiert die Verwendung von Literalen, um deren Duplizierung zu vermeiden. Dies führt zu einer einzigen Konstante für die Ganzzahl 257 im kompilierten Code.

Diese Optimierung ist nicht auf Ganzzahlen beschränkt, sondern gilt auch für andere Literale wie Gleitkommazahlen. Es funktioniert jedoch nicht für komplexere Literale wie Tupel, bei denen die Literale innerhalb des Tupels separat optimiert werden.

Der Grund, warum Sie die Erstellung von zwei PyInt_Objects beobachtet haben, liegt wahrscheinlich im Ansatz des Parsers, Literale in Ganzzahlen umzuwandeln . Der Parser verwendet eine Funktion, die das Literal in einen ganzzahligen Wert umwandelt und dann PyLong_FromString aufruft, um das ganzzahlige Objekt zu erstellen. Dieser Ansatz vermeidet das Umschreiben des Konvertierungscodes und ermöglicht eine einfache Erweiterung.

Die endgültige Optimierung, um sicherzustellen, dass gleiche Konstanten dasselbe Objekt verwenden, erfolgt jedoch während der Bytecode-Kompilierung und nicht während der AST-Transformation. Insbesondere ist die Funktion „compiler_add_o“ für das Speichern von Konstanten in einem Wörterbuchobjekt verantwortlich, was dazu führt, dass identische Konstanten in denselben Slot fallen und im endgültigen Bytecode durch eine einzige Konstante dargestellt werden.

Das obige ist der detaillierte Inhalt vonWarum speichert Python einige Ganzzahlen im Cache, andere jedoch nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn