159 votes

Comment Python gère-t-il les int et les long ?

Quelqu'un sait-il 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'>

Mise à jour :

>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>

0 votes

Les types stdc ne sont-ils pas simplement mappés à la volée sous CPython ?

0 votes

Oui, je pense que c'est le cas. Je soupçonne également que tout est alloué sur le tas, de sorte que lorsqu'un nombre a besoin d'une plus grande précision, il suffit de realloc Tout va bien. Mais je ne suis pas tout à fait sûr, alors je laisserai la réponse à quelqu'un d'autre.

2 votes

Vous pouvez également forcer python à utiliser une variable longue avec var = 666L

159voto

Ignacio Vazquez-Abrams Points 312628

int y long ont été "unifiées" quelques versions en arrière . Avant cela, il était possible de faire déborder un int par des opérations mathématiques.

La version 3.x a encore progressé dans ce sens en éliminant complètement le long et en ne conservant que l'int.

  • Python 2 : sys.maxint contient la valeur maximale qu'un int Python peut contenir.
    • Sur un Python 2.7 64 bits, la taille est de 24 octets. Vérifiez avec sys.getsizeof() .
  • Python 3 : sys.maxsize contient la taille maximale en octets d'un int Python.
    • Il s'agira de gigaoctets en 32 bits et d'exaoctets en 64 bits.
    • Un int aussi grand aurait une valeur similaire à 8 à la puissance de sys.maxsize .

37 votes

Mais Python3 appelle ce type "int", alors qu'il se comporte plutôt comme le type "long" de la version 2.x.

3 votes

Commentaire de Ted : Comme indiqué ci-dessous, il faut savoir que le fait de convertir en int une valeur supérieure à maxint donnera toujours un long >>>type(int(sys.maxint+1)) <type 'long'>.

2 votes

Sys.maxint vous donnera le plus grand entier 64 bits (sur ma machine 64 bits) un Long peut être beaucoup plus grand que 64 bits, essayez simplement "sys.maxint << 1000000"

25voto

mluebke Points 2588

Le présent PEP devrait aider.

En définitive, vous ne devriez pas avoir à vous en préoccuper dans les versions de Python > 2.4.

22 votes

Vous devez vous en préoccuper si vous devez appeler une fonction int en c avec quelque chose qui ne tient pas dans int (c'est-à-dire un long). Aucun casting long->int n'y changera rien. Cela m'est arrivé récemment.

2 votes

@Macke : Ce commentaire m'a sauvé, j'ai supposé que int ferait l'affaire, et je me demandais pourquoi j'obtenais encore une exception Jython.

1 votes

@Macke Absolument vrai. Dans l'entreprise où je travaille actuellement, nous avons un simulateur écrit en Python qui prend les entrées de l'utilisateur par le biais d'entrées Tkinter et envoie les valeurs moulées via TCP/IP à un client (écrit en C/C++) qui imite un système embarqué. Imaginez ce qui se passe lorsque vous insérez 100000000000000000000000 dans votre entrée basée sur Python... :P

6voto

MAK Points 12571

Sur ma machine :

>>> print type(1<<30)
<type 'int'>
>>> print type(1<<31)
<type 'long'>
>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'long'>

Python utilise des ints (entiers signés de 32 bits, je ne sais pas si ce sont des ints C sous le capot ou non) pour les valeurs qui tiennent dans 32 bits, mais passe automatiquement à des longs (un nombre arbitrairement grand de bits - c'est-à-dire des bignums) pour tout ce qui est plus grand. Je suppose que cela permet d'accélérer les choses pour les petites valeurs tout en évitant les débordements grâce à une transition transparente vers les bignums.

4voto

Gringo Suave Points 5985

Intéressant. Sur ma machine 64 bits (i7 Ubuntu) :

>>> print type(0x7FFFFFFF)
<type 'int'>
>>> print type(0x7FFFFFFF+1)
<type 'int'>

Je suppose qu'il passe à 64 bit ints sur une machine plus grande.

2 votes

Python utilise le plus grand type d'entier disponible pour la machine. Ainsi, sur les machines 32 bits, les entiers auront une taille de 32 bits, tandis que sur les machines 64 bits, ils auront une taille de 64 bits. Mais il peut y avoir des architectures 32 bits définissant des entiers 64 bits, dans ce cas Python utilisera l'entier 64 bits.

1voto

S.Lott Points 207588

Elle les gère parce que int y long sont des définitions de classes apparentées. Elles possèdent des méthodes appropriées pour +, -, *, /, etc., qui produiront des résultats de la classe appropriée.

Par exemple

>>> a=1<<30
>>> type(a)
<type 'int'>
>>> b=a*2
>>> type(b)
<type 'long'>

Dans ce cas, la classe int a une __mul__ (celle qui implémente *) qui crée un fichier long Le cas échéant, le résultat de l'enquête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X