tutorial notebook examples español python memory ipython

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:

  1. 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 .

  2. 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