Est-ce que quelqu'un sait comment Python gère en interne les types int et long?
- Choisit-il le bon type de manière dynamique?
- Quelle est la limite pour un int?
- J'utilise Python 2.6, est-ce différent des versions précédentes?
Comment dois-je comprendre le code ci-dessous?
>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>
Mettre à jour:
>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>
realloc
tout va bien. Mais je ne suis pas tout à fait sûr, alors je vais laisser la réponse à quelqu'un d'autre.var = 666L
int
est un Clong
(la valeur par défaut est signée) ... voir<CPython 2.X source>/Include/intobject.h
: typedef struct {PyObject_HEAD long ob_ival; } PyIntObject; Dans tous les cas, Python 2.xint
autorise les nombres négatifs; un Cunsigned
ne ferait tout simplement pas l'affaire.Réponses:
int
etlong
ont été "unifiées" quelques versions en arrière . Avant cela, il était possible de déborder un int à travers des opérations mathématiques.3.x a encore avancé cela en éliminant complètement long et en n'ayant que int.
sys.maxint
contient la valeur maximale qu'un int Python peut contenir.sys.getsizeof()
.sys.maxsize
contient la taille maximale en octets qu'un int Python peut avoir.sys.maxsize
.la source
int
est le même que Python 2long
).Ce PEP devrait aider.
En fin de compte, vous ne devriez vraiment pas avoir à vous en soucier dans les versions python> 2.4
la source
Sur ma machine:
Python utilise des entiers (entiers signés 32 bits, je ne sais pas si ce sont des entiers C sous le capot ou non) pour les valeurs qui tiennent dans 32 bits, mais passe automatiquement en longs (nombre arbitrairement grand de bits - c'est-à-dire bignums) pour quoi que ce soit plus grand. Je suppose que cela accélère les choses pour les valeurs plus petites tout en évitant les débordements avec une transition transparente vers les bignums.
la source
Intéressant. Sur ma boîte 64 bits (i7 Ubuntu):
Je suppose que cela augmente jusqu'à 64 bits sur une machine plus grande.
la source
Python 2.7.9 favorise automatiquement les nombres. Pour un cas où l'on n'est pas sûr d'utiliser int () ou long ().
la source
Python 2 définira automatiquement le type en fonction de la taille de la valeur. Vous trouverez ci-dessous un guide des valeurs maximales.
La valeur Max de l'Int par défaut dans Python 2 est 65535, tout ce qui est au-dessus sera long
Par exemple:
Dans Python 3, le type de données long a été supprimé et toutes les valeurs entières sont gérées par la classe Int. La taille par défaut de Int dépendra de l'architecture de votre CPU.
Par exemple:
Les valeurs min / max de chaque type se trouvent ci-dessous:
Si la taille de votre Int dépasse les limites mentionnées ci-dessus, python changera automatiquement son type et allouera plus de mémoire pour gérer cette augmentation des valeurs min / max. Là où dans Python 2, il se convertirait en `` long '', il se convertit maintenant simplement en la taille suivante de Int.
Exemple: Si vous utilisez un système d'exploitation 32 bits, la valeur maximale d'un Int sera 2147483647 par défaut. Si une valeur de 2147483648 ou plus est affectée, le type sera changé en Int64.
Il existe différentes façons de vérifier la taille de l'int et son allocation de mémoire. Remarque: dans Python 3, l'utilisation de la méthode intégrée type () retournera toujours
<class 'int'>
quelle que soit la taille Int que vous utilisez.la source
Depuis python 3.x, les libries d'entiers unifiés sont encore plus intelligentes que les anciennes versions. Sur ma boîte (i7 Ubuntu), j'ai obtenu ce qui suit,
Pour plus de détails sur la mise en œuvre, reportez-vous aux
Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c
fichiers. Le dernier fichier est un module dynamique (compilé dans un fichier so). Le code est bien commenté à suivre.la source
Juste pour continuer avec toutes les réponses qui ont été données ici, en particulier @James Lanes
la taille du type entier peut être exprimée par cette formule:
plage totale = (système 2 ^ bits)
limite inférieure = - (système 2 ^ bits) * 0,5 limite supérieure = ((système 2 ^ bits) * 0,5) - 1
la source
Il les gère parce que
int
etlong
sont des définitions de classe frères. Ils ont des méthodes appropriées pour +, -, *, /, etc., qui produiront des résultats de la classe appropriée.Par exemple
Dans ce cas, la classe
int
a une__mul__
méthode (celle qui implémente *) qui crée unlong
résultat si nécessaire.la source