2011-10-15 22 views
6
>>> sys.getsizeof(int) 
436 #? does this mean int occupies 436 bytes . 

>>> sys.getsizeof(1) 
12 #12 bytes for int object, is this the memory requirement. 

pensé int de Python está representado por 4 bytes, ¿por qué se informa de 12 bytes¿Cómo puedo determinar el tamaño exacto de un tipo utilizado por pitón

Por favor alguien explicar por qué se informa de 12 bytes cuando se int usa solo 4 bytes

+0

posible duplicado de [¿Cómo perfilo el uso de memoria en Python?] (Http://stackoverflow.com/questions/552744/how-do-i-profile-memory-usage-in-python) –

+0

También, [ este]] (http://stackoverflow.com/questions/110259/python-memory-profiler). Básicamente, la herramienta vinculada allí (Heapy) es parte de una tesis sobre perfiles de memoria en Python. Si realmente quieres saber, mira eso. –

Respuesta

10

Sí, una instancia de int ocupa 12 bytes en su sistema. Los enteros (como cualquier objeto) tienen atributos, es decir, punteros a otros objetos, que ocupan espacio de memoria adicional más allá de lo que usa el propio valor del objeto. Entonces 4 bytes para el valor entero, 4 bytes para un puntero a __class__ (de lo contrario, Python no sabría a qué tipo pertenecía el objeto y cómo comenzar a resolver los nombres de atributo que se heredan de la clase int y sus padres), y otro 4 para el recuento de referencia del objeto, que utiliza el recolector de basura.

El tipo int ocupa 436 bytes en su sistema, que serán punteros a los diversos métodos y otros atributos de la clase int y cualquier otra información de mantenimiento que Python requiera para la clase. La clase int está escrita en C en la implementación estándar de Python; podrías ir a ver el código fuente y ver qué hay allí.

+1

qué alivio ... gracias por explicarme. – George

+0

Python no almacena enteros (suficientemente pequeños) mediante el uso de un bit especial en el puntero del objeto, como lo hacen algunos otros lenguajes (ruby, algunos ceceos), por lo que usan bastante memoria para los simples. Si 12 bytes son demasiado para usted y desea almacenar grandes matrices de entradas, busque en las matrices especiales de Numpy. –

+0

@eryksun: O piense en cuán terrible sería el rendimiento promedio de 'array.append' si no se asigna demasiado, o lea la fuente (arraymodule.c). –

2

De la documentación de sys.getsizeof:

getsizeof() llama el método del objeto __sizeof__ y agrega una sobrecarga adicional recolector de basura si el objeto es administrado por el recolector de basura.

Eso podría ser por qué sys.getsizeof(1) le está dando 12 bytes. En cuanto a su primera línea, tenga en cuenta lo que el objeto es int:

>>> int 
<type 'int'> 

int es el tipo entero en sí, y no es un entero. Un número entero en python realmente ocupa tantos bytes como necesita (razón por la cual no necesita preocuparse por el desbordamiento), mientras que el tipo es donde se maneja toda esa funcionalidad. Creo que esta distinción solo es válida para los tipos incorporados, y para los objetos definidos por el usuario, el tipo en sí mismo es probablemente de un tamaño similar al de una instancia de ese tipo.

Cuestiones relacionadas