2010-12-11 13 views
5

Necesitaba verificar las estadísticas de memoria de los objetos que uso en python.
Encontré guppy y pysizer, pero no están disponibles para python2.7.
¿Hay un perfilador de memoria disponible para python 2.7?
Si no, ¿hay alguna manera de hacerlo yo mismo?¿Hay un perfilador de memoria para python2.7?

+0

¿* Realmente * necesita perfilar su código? ¡Sólo preguntaba! – user225312

+0

"verificar las estadísticas de memoria de los objetos" ¿Por qué? ¿Qué problema ** específico está teniendo? ¿Sin memoria? El perfilado no suele ser necesario; por lo general, es * obvio * qué objeto es demasiado grande. Por favor explica qué problema estás observando en realidad. –

+2

posible duplicado de [Analizador de memoria Python] (http://stackoverflow.com/questions/110259/python-memory-profiler) –

Respuesta

2

Es posible que desee para tratar de adaptar el código siguiente para su situación específica y admite sus tipos de datos:

import sys 


def sizeof(variable): 
    def _sizeof(obj, memo): 
     address = id(obj) 
     if address in memo: 
      return 0 
     memo.add(address) 
     total = sys.getsizeof(obj) 
     if obj is None: 
      pass 
     elif isinstance(obj, (int, float, complex)): 
      pass 
     elif isinstance(obj, (list, tuple, range)): 
      if isinstance(obj, (list, tuple)): 
       total += sum(_sizeof(item, memo) for item in obj) 
     elif isinstance(obj, str): 
      pass 
     elif isinstance(obj, (bytes, bytearray, memoryview)): 
      if isinstance(obj, memoryview): 
       total += _sizeof(obj.obj, memo) 
     elif isinstance(obj, (set, frozenset)): 
      total += sum(_sizeof(item, memo) for item in obj) 
     elif isinstance(obj, dict): 
      total += sum(_sizeof(key, memo) + _sizeof(value, memo) 
         for key, value in obj.items()) 
     elif hasattr(obj, '__slots__'): 
      for name in obj.__slots__: 
       total += _sizeof(getattr(obj, name, obj), memo) 
     elif hasattr(obj, '__dict__'): 
      total += _sizeof(obj.__dict__, memo) 
     else: 
      raise TypeError('could not get size of {!r}'.format(obj)) 
     return total 
    return _sizeof(variable, set()) 
+0

Parece prometedor, pero creo que debería cambiarlo a 'def getsizeof (obj, memo = None):' y mover la inicialización de 'memo' dentro de la función con' if memo is None: memo = set() '. Por supuesto, todas las llamadas recursivas a 'getsizeof()' tendrían que tener sus argumentos intercambiados también. – martineau

+1

@martineau: una promesa que no debe arrojarse casualmente en el camino de un novato. Manejar instancias de clases a través de todas las complejidades de antiguo/nuevo, con/sin '__slots__', herencia no/única/múltiple, etc. es una pesadilla. Véase, por ejemplo, http://code.activestate.com/recipes/546530-size-of-python-objects-revised/, que tomó más de 2000 SLOC y múltiples versiones para llevarlo a un error que no se sabe que sea incorrecto. estado. Estoy de acuerdo con tu comentario sobre el 'memo' arg. –

+0

@John Machin: la receta del estado activo ahora está más cerca de 3000 líneas de código fuente y es la versión 5.12, por lo que el caso general es aparentemente muy difícil de descifrar, que es una de las razones por las que encontré la respuesta de @Noctis Skytower porque con frecuencia no necesita una herramienta que maneje todos los casos imaginables, solo unos pocos. Con suerte 'sys.getsizeof() 'mejorará en el futuro. En realidad, nunca lo he necesitado para nada, por lo que solo he tenido conocimiento de que se ha agregado, y no de todas sus deficiencias. – martineau

1

No conozco ningún generador de perfiles para Python 2.7, pero consulte la siguiente función que se ha agregado al módulo sys, podría ayudarlo a hacerlo usted mismo.

"Una nueva función, getsizeof(), toma un objeto Python y devuelve la cantidad de memoria utilizada por el objeto, medida en bytes objetos integrados vuelven resultados correctos;. Terceros extensiones pueden no, pero puede definir un método __sizeof__() para devolver el tamaño del objeto ".

Aquí hay enlaces a lugares en los documentos en línea con la información al respecto:

        What’s New in Python 2.6
        27.1. sys module — System-specific parameters and functions

+0

Podría pero no es así. 'sys.getsizeof' es" una trampa y un engaño ". Lea esta pregunta ASÍ, en particular la respuesta de Thomas Wouters: http://stackoverflow.com/questions/2117255 –

+0

@John Machin: En ese caso, ¿qué opina de la respuesta de @Noctis Skytower? – martineau

Cuestiones relacionadas