Obtener tamaño de entero en Python

¿Cómo puedo saber la cantidad de Bytes que un determinado número toma para almacenar? Por ejemplo, para \ x00 – \ xFF Estoy buscando obtener 1 (Byte), \ x100 – \ xffff me daría 2 (Bytes) y así sucesivamente. ¿Cualquier pista?

Puedes usar matemáticas simples:

>>> from math import log >>> def bytes_needed(n): ... if n == 0: ... return 1 ... return int(log(n, 256)) + 1 ... >>> bytes_needed(0x01) 1 >>> bytes_needed(0x100) 2 >>> bytes_needed(0x10000) 3 

A menos que esté tratando con un array.array o un numpy.array , el tamaño siempre tiene una sobrecarga de objetos. Y como Python trata con BigInts de forma natural, es muy, muy difícil decirlo …

 >>> i = 5 >>> import sys >>> sys.getsizeof(i) 24 

Entonces, en una plataforma de 64 bits, se requieren 24 bytes para almacenar lo que podría almacenarse en 3 bits.

Sin embargo, si lo hiciste,

 >>> s = '\x05' >>> sys.getsizeof(s) 38 

Así que no, no realmente, tiene la sobrecarga de memoria de la definición del object lugar del almacenamiento en bruto …

Si luego tomas:

 >>> a = array.array('i', [3]) >>> a array('i', [3]) >>> sys.getsizeof(a) 60L >>> a = array.array('i', [3, 4, 5]) >>> sys.getsizeof(a) 68L 

Entonces obtienes lo que se denominaría límites de bytes normales, etc., etc., etc., etc.

Si solo desea que se almacene “puramente” – menos la sobrecarga de objetos, entonces desde 2. (6 | 7) puede usar some_int.bit_length() (de lo contrario, solo búscelo como otras respuestas) y luego trabaje desde allí

 def byte_length(i): return (i.bit_length() + 7) // 8 

Por supuesto, como señala Jon Clements, este no es el tamaño del PyIntObject real, que tiene un encabezado PyObject, y almacena el valor como un bignum de la manera que sea más fácil de manejar que el más compacto, y con el que tiene para tener al menos un puntero (4 u 8 bytes) encima del objeto real, y así sucesivamente.

Pero esta es la longitud del byte del número en sí. Es casi seguro que es la respuesta más eficiente, y probablemente también la más fácil de leer.

¿O es ceil(i.bit_length() / 8.0) más legible?

Al usar una operación biwise simple para mover todos los bits usados ​​más de 1 byte cada vez que puede ver cuántos bytes se necesitan para almacenar un número.

Probablemente vale la pena señalar que, si bien este método es muy genérico, no funcionará en números negativos y solo mira el binario de la variable sin tener en cuenta en qué está almacenado.

 a = 256 i = 0 while(a > 0): a = a >> 8; i += 1; print (i) 

El progtwig se comporta de la siguiente manera:

a es 0000 0001 0000 0000 en binario cada ejecución del bucle lo desplazará a la izquierda en 8:

 loop 1: 0000 0001 >> 0000 0000 0000 0001 > 0 (1 > 0) loop 2: 0000 0000 >> 0000 0001 0000 0000 > 0 (0 > 0) END 0 is not > 0 

por lo que hay 2 bytes necesarios para almacenar el número.

en el símbolo del sistema de python, puede usar el tamaño de la función

 **$ import python $ import ctypes $ ctypes.sizeof(ctypes.c_int)** 
 # Python 3 import math nbr = 0xff # 255 defined in hexadecimal nbr = "{0:b}".format(nbr) # Transform the number into a string formated as bytes. bit_length = len(nbr) # Number of characters byte_length = math.ceil( bit_length/8 ) # Get minimum number of bytes