¿Alguien sabe cómo Python gestiona internamente los tipos int y long?
- ¿Elige el tipo correcto de forma dinámica?
- ¿Cuál es el límite para un int?
- Estoy usando Python 2.6, ¿es diferente con las versiones anteriores?
¿Cómo debo entender el siguiente código?
>>> print type(65535)
<type 'int'>
>>> print type(65536*65536)
<type 'long'>
Actualizar:
>>> print type(0x7fffffff)
<type 'int'>
>>> print type(0x80000000)
<type 'long'>
realloc
lo hacen bien. Pero no estoy muy seguro, así que dejaré la respuesta a otra persona.var = 666L
int
es un Clong
(por defecto está firmado) ... ver<CPython 2.X source>/Include/intobject.h
: typedef struct {PyObject_HEAD long ob_ival; } PyIntObject; En cualquier caso, Python 2.xint
permite números negativos; una Cunsigned
simplemente no se las arreglaría.Respuestas:
int
ylong
fueron "unificadas" algunas versiones atrás . Antes de eso, era posible desbordar un int a través de operaciones matemáticas.3.x ha avanzado aún más en esto al eliminar long por completo y solo tener int.
sys.maxint
contiene el valor máximo que puede contener un int de Python.sys.getsizeof()
.sys.maxsize
contiene el tamaño máximo en bytes que puede tener un int de Python.sys.maxsize
.fuente
int
es lo mismo que Python 2long
).Este PEP debería ayudar.
La conclusión es que realmente no debería tener que preocuparse por eso en las versiones de Python> 2.4
fuente
En mi maquina:
Python usa ints (enteros de 32 bits con signo, no sé si son C ints bajo el capó o no) para valores que encajan en 32 bits, pero cambia automáticamente a longs (cantidad arbitrariamente grande de bits, es decir, bignums) para cualquier cosa más grande. Supongo que esto acelera las cosas para valores más pequeños al tiempo que evita cualquier desbordamiento con una transición perfecta a bignums.
fuente
Interesante. En mi caja de 64 bits (i7 Ubuntu):
Supongo que aumenta a entradas de 64 bits en una máquina más grande.
fuente
Python 2.7.9 promueve automáticamente los números. Para un caso en el que uno no está seguro de usar int () o long ().
fuente
Python 2 establecerá automáticamente el tipo según el tamaño del valor. A continuación se puede encontrar una guía de valores máximos.
El valor máximo del Int predeterminado en Python 2 es 65535, todo lo que esté por encima será un largo
Por ejemplo:
En Python 3, el tipo de datos largo se ha eliminado y la clase Int maneja todos los valores enteros. El tamaño predeterminado de Int dependerá de la arquitectura de su CPU.
Por ejemplo:
Los valores mínimo / máximo de cada tipo se pueden encontrar a continuación:
Si el tamaño de su Int excede los límites mencionados anteriormente, Python cambiará automáticamente su tipo y asignará más memoria para manejar este aumento en los valores mínimo / máximo. Donde en Python 2, se convertiría en 'largo', ahora simplemente se convierte en el siguiente tamaño de Int.
Ejemplo: si está utilizando un sistema operativo de 32 bits, su valor máximo de un Int será 2147483647 por defecto. Si se asigna un valor de 2147483648 o más, el tipo se cambiará a Int64.
Hay diferentes formas de verificar el tamaño del int y su asignación de memoria. Nota: En Python 3, el uso del método integrado type () siempre devolverá
<class 'int'>
sin importar el tamaño de Int que esté usando.fuente
Desde python 3.x, las bibliotecas de enteros unificadas son incluso más inteligentes que las versiones anteriores. En mi caja (i7 Ubuntu) obtuve lo siguiente,
Para obtener detalles sobre la implementación, consulte los
Include/longintrepr.h, Objects/longobject.c and Modules/mathmodule.c
archivos. El último archivo es un módulo dinámico (compilado en un archivo so). El código está bien comentado para seguir.fuente
Solo para continuar con todas las respuestas que se dieron aquí, especialmente @James Lanes
el tamaño del tipo entero se puede expresar mediante esta fórmula:
rango total = (sistema de 2 ^ bits)
límite inferior = - (sistema de 2 ^ bits) * 0.5 límite superior = ((sistema de 2 ^ bits) * 0.5) - 1
fuente
Los gestiona porque
int
ylong
son definiciones de clases hermanas. Tienen métodos apropiados para +, -, *, /, etc., que producirán resultados de la clase apropiada.Por ejemplo
En este caso, la clase
int
tiene un__mul__
método (el que implementa *) que crea unlong
resultado cuando se requiere.fuente