Maison >développement back-end >Tutoriel Python >Pourquoi Python met-il en cache certains entiers mais pas d'autres ?
Qu'est-ce que le cache d'entiers maintenu par l'interprète ?
Python optimise les littéraux identiques lors de leur compilation dans le même objet de code, ce qui donne lieu à des objets ayant la même identité. Généralement, les entiers compris dans la plage [-5, 256] sont mis en cache, mais cela ne garantit pas que tous les entiers compris dans cette plage auront la même identité.
Dans l'exemple de code que vous avez fourni, lorsque vous exécutez chaque ligne séparément dans le shell Python :
>>> a = 1 >>> b = 1 >>> a is b True
le code est analysé et compilé séparément pour chaque ligne. Cependant, lorsque vous exécutez le même code ensemble dans un fichier :
>>> a = 257; b = 257; a is b True
le compilateur peut optimiser les littéraux. Lors du processus de compilation, l'AST est transformé en bytecode et le compilateur analyse l'utilisation des littéraux pour éviter leur duplication. Il en résulte une seule constante pour l'entier 257 dans le code compilé.
Cette optimisation ne se limite pas aux entiers mais s'applique également à d'autres littéraux tels que les flottants. Cependant, cela ne fonctionne pas pour les littéraux plus complexes comme les tuples, où les littéraux à l'intérieur du tuple sont optimisés séparément.
La raison pour laquelle vous avez observé la création de deux PyInt_Objects est probablement due à l'approche de l'analyseur pour convertir les littéraux en entiers. . L'analyseur utilise une fonction qui convertit le littéral en valeur entière, puis appelle PyLong_FromString pour créer l'objet entier. Cette approche évite de réécrire le code de conversion et permet une extension facile.
Cependant, l'optimisation finale pour garantir que des constantes égales utilisent le même objet se produit lors de la compilation du bytecode, et non lors de la transformation AST. Plus précisément, la fonction compiler_add_o est responsable du stockage des constantes dans un objet dictionnaire, ce qui fait que des constantes identiques tombent dans le même emplacement et sont représentées par une seule constante dans le bytecode final.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!