6
votes

La disposition de Python d'INTS de faible valeur en mémoire

Ma question est la suivante: où proviennent ces modèles (ci-dessous)?

J'ai appris (quelque part) que Python a des "copies" uniques, si c'est le mot juste, pour les petits entiers. Par exemple: p> xxx pré>

Lorsque je regarde les emplacements de mémoire de l'INT, il existe un modèle simple tôt: P>

#define NSMALLPOSINTS       257
#define NSMALLNEGINTS       5


7 commentaires

"Toute pensée, indices, endroits à regarder?" Oui. Lire la source. Cela vous dira tout ce que vous voulez savoir à ce sujet.


Oui, mais la source est comme c, ou quelque chose. :) J'espérais un équivalent de PEP.


Le PEP ne spécifierait pas les détails de la mise en œuvre comme ça. Si vous voulez savoir quelque chose comme ceci, ce qui n'affecte pas le code (sain d'esprit), ce sera dans la source.


Pas dans un PEP, mais pas non plus dans la source: docs.python.org/ C-API / INT.HTML # PYINT_FROMLONG (qui note que ses valeurs de -5 à 256).


Oh, voir aussi Stackoverflow.com / Questions / 306313 / ...


@Peter Hansen Merci pour les deux liens, c'est très utile.


Lien vers la source, pour ceux qui se soucient (recherche "_Cyint_Init"): svn.python.org/projects/python/trunk/Objects/intObject.c


6 Réponses :


0
votes

0 commentaires

2
votes

Les premiers 256 Ints sont préallocated xxx


0 commentaires

8
votes

Les entiers à faible valeur sont prévenalisés, des entiers de haute valeur sont alloués chaque fois qu'ils sont calculés. Les entiers qui apparaissent dans le code source sont le même objet. Sur mon système,

>>> id(0)
8402324


1 commentaires

Spécifiquement (et seulement actuellement), il s'agit de valeurs de -5 à 256. Il serait peut-être une bonne idée d'expliquer dans la réponse pourquoi l'affaire ID (1000) Retourne true. (C'est l'une de ces choses qui ne sont que raisonnablement évidentes une fois que cela vous a été expliqué.)



1
votes

Les entiers allant jusqu'à 256 sont internés, c'est pourquoi vous voyez un "motif" là-bas. Tous les autres entiers sont créés lors de l'exécution et, en tant que tel, alloué aléatoire ID .


1 commentaires

D'ACCORD. "aléatoire" ou autre, au-dessus de 256.



2
votes

Je semble rappeler que Python met en cache en interne des copies d'INT <256 pour enregistrer avoir à créer de nouveaux objets Python pour des cas couramment utilisés. Donc, une fois que vous avez passé plus de 256 ans, vous obtenez des objets nouvellement créés à chaque fois, ce qui peut sembler être «aléatoirement» dans la mémoire (évidemment, leurs emplacements auraient un sens à l'allocator de Python, mais probablement pas pour nous).


0 commentaires

2
votes

Étant donné que d'autres ont répondu parfaitement pourquoi les identifiants ont un motif distinct jusqu'à 256, je pensais que je répondais à votre addendum à la place: 24 est la taille en octets d'un objet entier en Python. Lorsque les 256 premiers entiers sont alloués, ils sont faits si contiguës en mémoire, entraînant une différence entre chaque adresse de la mémoire.


0 commentaires