python - notebook - jupyter server
¿Cómo puedo verificar el uso de memoria de los objetos en iPython? (3)
Estoy usando iPython para ejecutar mi código. Me pregunto si hay algún módulo o comando que me permita verificar el uso de memoria de un objeto. Por ejemplo:
In [1]: a = range(10000)
In [2]: %memusage a
Out[2]: 1MB
Algo así como %memusage <object>
y devuelve la memoria utilizada por el objeto.
Duplicar
Averiguar cuánta memoria está siendo utilizada por un objeto en Python
ACTUALIZACIÓN: Aquí hay another receta, quizás más completa, para estimar el tamaño de un objeto python.
Aquí hay un thread aborda una pregunta similar
La solución propuesta es escribir la suya ... usando algunas estimaciones del tamaño conocido de las primitivas, la sobrecarga de objetos de python y los tamaños de los tipos de contenedores integrados.
Como el código no es tan largo, aquí hay una copia directa:
def sizeof(obj):
"""APPROXIMATE memory taken by some Python objects in
the current 32-bit CPython implementation.
Excludes the space used by items in containers; does not
take into account overhead of memory allocation from the
operating system, or over-allocation by lists and dicts.
"""
T = type(obj)
if T is int:
kind = "fixed"
container = False
size = 4
elif T is list or T is tuple:
kind = "variable"
container = True
size = 4*len(obj)
elif T is dict:
kind = "variable"
container = True
size = 144
if len(obj) > 8:
size += 12*(len(obj)-8)
elif T is str:
kind = "variable"
container = False
size = len(obj) + 1
else:
raise TypeError("don''t know about this kind of object")
if kind == "fixed":
overhead = 8
else: # "variable"
overhead = 12
if container:
garbage_collector = 8
else:
garbage_collector = 0
malloc = 8 # in most cases
size = size + overhead + garbage_collector + malloc
# Round to nearest multiple of 8 bytes
x = size % 8
if x != 0:
size += 8-x
size = (size + 8)
return size
Lamentablemente, esto no es posible, pero hay varias maneras de aproximar la respuesta:
para objetos muy simples (por ej., enter, strings, floats, doubles) que se representan más o menos como simples tipos de lenguaje C, simplemente puede calcular el número de bytes como con la solución de John Mulder .
Para objetos más complejos, una buena aproximación es serializar el objeto a una cadena usando cPickle.dumps. La longitud de la cadena es una buena aproximación de la cantidad de memoria requerida para almacenar un objeto.
Hay una gran pega con la solución 2, que es que los objetos generalmente contienen referencias a otros objetos. Por ejemplo, un dict contiene string-keys y otros objetos como valores. Esos otros objetos pueden ser compartidos. Como pickle siempre intenta hacer una serialización completa del objeto, siempre sobreestimará la cantidad de memoria requerida para almacenar un objeto.
Si está usando una matriz numpy , puede usar el atributo ndarray.nbytes
para evaluar su tamaño en la memoria:
from pylab import *
d = array([2,3,4,5])
d.nbytes
#Output: 32