492 votos

¿Cómo puedo determinar el tamaño de un objeto en Python?

Quiero saber cómo obtener el tamaño de objetos como una cadena, un entero, etc. en Python.

Pregunta relacionada: ¿Cuántos bytes por elemento hay en una lista (tupla) de Python?

Estoy utilizando un archivo XML que contiene campos de tamaño que especifican el tamaño del valor. Debo parsear este XML y hacer mi codificación. Cuando quiero cambiar el valor de un campo en particular, voy a comprobar el campo de tamaño de ese valor. Aquí quiero comparar si el nuevo valor que voy a introducir tiene el mismo tamaño que en el XML. Necesito comprobar el tamaño del nuevo valor. En el caso de una cadena puedo decir que es la longitud. Pero en el caso de int, float, etc. Estoy confundido.

508voto

nosklo Puntos 75862

Sólo tiene que utilizar el sys.getsizeof definida en el sys módulo.

sys.getsizeof(object[, default]) :

Devuelve el tamaño de un objeto en bytes. El objeto puede ser de cualquier tipo. Todos los objetos incorporados devolverán resultados correctos, pero esto no tiene que ser cierto para las extensiones de extensiones de terceros, ya que es una implementación de la implementación.

Sólo se contabiliza el consumo de memoria atribuido directamente al objeto se contabiliza, no el consumo de memoria de los objetos a los que se refiere.

El default permite definir un valor que será devuelto si el tipo de objeto no proporciona medios para recuperar el tamaño y provocaría un TypeError .

getsizeof llama a la función __sizeof__ y añade una sobrecarga adicional del recolector de basura si el objeto es gestionado por el recolector de basura.

Ver receta recursiva sizeof para un ejemplo de uso de getsizeof() recursivamente para encontrar el tamaño de los contenedores y todo su contenido.

Ejemplo de uso, en Python 3.0:

>>> import sys
>>> x = 2
>>> sys.getsizeof(x)
24
>>> sys.getsizeof(sys.getsizeof)
32
>>> sys.getsizeof('this')
38
>>> sys.getsizeof('this also')
48

Si estás en Python < 2.6 y no tienes sys.getsizeof puede utilizar este extenso módulo en su lugar. Sin embargo, nunca lo he utilizado.

75voto

Mike Dewar Puntos 2208

Para matrices numpy, getsizeof no funciona - para mí siempre devuelve 40 por alguna razón:

from pylab import *
from sys import getsizeof
A = rand(10)
B = rand(10000)

Entonces (en ipython):

In [64]: getsizeof(A)
Out[64]: 40

In [65]: getsizeof(B)
Out[65]: 40

Sin embargo, felizmente:

In [66]: A.nbytes
Out[66]: 80

In [67]: B.nbytes
Out[67]: 80000

12voto

Brian Puntos 48423

Esto puede ser más complicado de lo que parece dependiendo de cómo quieras contar las cosas. Por ejemplo, si tienes una lista de ints, ¿quieres el tamaño de la lista que contiene el referencias a los ints? (es decir, sólo la lista, no lo que contiene), o quieres incluir los datos reales a los que se apunta, en cuyo caso tienes que lidiar con las referencias duplicadas, y cómo evitar el doble conteo cuando dos objetos contienen referencias al mismo objeto.

Puede que quieras echar un vistazo a uno de los perfiladores de memoria de Python, como pysizer para ver si satisfacen sus necesidades.

9voto

alexey Puntos 154

Aquí hay un rápido script que escribí basado en las respuestas anteriores para listar los tamaños de todas las variables

for i in dir():
    print (i, sys.getsizeof(eval(i)) )

-5voto

Jeff Shannon Puntos 3439

Primero: una respuesta.

import sys

try: print sys.getsizeof(object)
except AttributeError:
    print "sys.getsizeof exists in Python ≥2.6"

Discusión:
En Python, nunca se puede acceder a direcciones de memoria "directas". ¿Por qué, entonces, necesitarías o querrías saber cuántas de esas direcciones están ocupadas por un objeto dado? Es una pregunta totalmente inapropiada a ese nivel de abstracción. Cuando se pinta una casa, no se pregunta qué frecuencias de luz absorbe o refleja cada uno de los átomos que la componen, sino que se pregunta de qué color es: los detalles de las características físicas que crean ese color no vienen al caso. Del mismo modo, el número de bytes de memoria que ocupa un determinado objeto de Python no viene al caso.

Entonces, ¿por qué intentas usar Python para escribir código C? :)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X