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?
Respuesta
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())
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
@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. –
@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
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
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 –
@John Machin: En ese caso, ¿qué opina de la respuesta de @Noctis Skytower? – martineau
Aquí hay uno que funciona para Python 2.7: The Pympler package.
- 1. ¿Hay un perfilador visual para Python?
- 2. ¿hay un perfilador CLR para .NET 4.0?
- 3. Perfilador de memoria para .NET Compact Framework
- 4. ¿Hay un perfilador de línea gratuito y bueno para PHP?
- 5. ¿Mejor perfilador de rendimiento y memoria .NET?
- 6. ¿Hay algún perfilador decente de C#?
- 7. Perfilador decente para Windows?
- 8. ¿cómo funciona un perfilador C#?
- 9. Buen perfilador de C++ para GCC
- 10. GAE + Python2.7 + webapp2 + AJAX
- 11. perfilador de microsegundos para el código C
- 12. Ejecutando el perfilador en un agente de fondo
- 13. Buscando un perfilador de C++ de bajo impacto
- 14. ¿Cómo instalar gtk en python2.7?
- 15. Con el mini perfilador
- 16. ¿Hay un registrador de rendimiento o perfilador de Java a largo plazo?
- 17. ¿Hay un apilador de memoria log4net?
- 18. ¿Hay un perfilador de CLR que funcione con .NET 3.5 SP1 y WPF?
- 19. python2.7: configuración de registro con yaml
- 20. ¿Cómo instalar correctamente isapi_wsgi en IIS para Python2.7?
- 21. ¿Hay un proveedor en memoria para Entity Framework?
- 22. importa sqlite3 con Python2.7 en Heroku
- 23. ¿Existe un equivalente PostgreSQL del perfilador de SQL Server?
- 24. Node.js módulo v8-perfilador no se instalará
- 25. ¿Cómo desencadenar el perfilador de XDebug para un script PHP de línea de comando?
- 26. ¿Hay algún perfil de memoria de trabajo para Python3
- 27. ¿Cómo instalar paquetes específicos de python2.7 en Arch Linux?
- 28. pila de llamadas en el perfilador Potencia
- 29. ¿Hay un analizador de Go?
- 30. Configuración de fondo con Python2.7 Crontab en Ubuntu 12.04
¿* Realmente * necesita perfilar su código? ¡Sólo preguntaba! – user225312
"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. –
posible duplicado de [Analizador de memoria Python] (http://stackoverflow.com/questions/110259/python-memory-profiler) –