¿Qué perfil de memoria de Python se recomienda?

Quiero saber el uso de memoria de mi aplicación Python y específicamente quiero saber qué bloques de código / porciones u objetos consumen la mayoría de la memoria. La búsqueda de Google muestra que uno comercial es Python Memory Validator (solo para Windows).

Y los de código abierto son PySizer y Heapy .

No he probado a nadie, así que quería saber cuál es el mejor considerando:

  1. Da la mayoría de los detalles.

  2. Tengo que hacer menos o ningún cambio en mi código.

Heapy es bastante simple de usar. En algún punto de tu código, debes escribir lo siguiente:

from guppy import hpy h = hpy() print h.heap() 

Esto te da una salida como esta:

 Partition of a set of 132527 objects. Total size = 8301532 bytes. Index Count % Size % Cumulative % Kind (class / dict of class) 0 35144 27 2140412 26 2140412 26 str 1 38397 29 1309020 16 3449432 42 tuple 2 530 0 739856 9 4189288 50 dict (no owner) 

También puede averiguar desde dónde se hace referencia a los objetos y obtener estadísticas sobre eso, pero de alguna manera los documentos que contiene son un poco escasos.

También hay un navegador gráfico, escrito en Tk.

Como nadie lo ha mencionado, señalaré a mi módulo memory_profiler, que es capaz de imprimir informes línea por línea sobre el uso de la memoria y funciona en Unix y Windows (necesita psutil en esta última). La salida no es muy detallada, pero el objective es brindarle una descripción general de dónde el código consume más memoria y no un análisis exhaustivo de los objetos asignados.

Después de decorar su función con @profile y ejecutar su código con el -m memory_profiler , se imprimirá un informe línea por línea como este:

 Line # Mem usage Increment Line Contents ============================================== 3 @profile 4 5.97 MB 0.00 MB def my_func(): 5 13.61 MB 7.64 MB a = [1] * (10 ** 6) 6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7) 7 13.61 MB -152.59 MB del b 8 13.61 MB 0.00 MB return a 

Recomiendo Dowser . Es muy fácil de configurar y no necesita cambios en su código. Puede ver los recuentos de objetos de cada tipo a través del tiempo, ver la lista de objetos en vivo, ver referencias a objetos en vivo, todo desde la sencilla interfaz web.

 # memdebug.py import cherrypy import dowser def start(port): cherrypy.tree.mount(dowser.Root()) cherrypy.config.update({ 'environment': 'embedded', 'server.socket_port': port }) cherrypy.server.quickstart() cherrypy.engine.start(blocking=False) 

Importa memdebug y llama a memdebug.start. Eso es todo.

No he probado PySizer o Heapy. Apreciaría las críticas de otros.

ACTUALIZAR

El código anterior es para CherryPy 2.X , CherryPy 3.X el método server.quickstart se eliminó y engine.start no toma la server.quickstart blocking . Así que si estás usando CherryPy 3.X

 # memdebug.py import cherrypy import dowser def start(port): cherrypy.tree.mount(dowser.Root()) cherrypy.config.update({ 'environment': 'embedded', 'server.socket_port': port }) cherrypy.engine.start() 

Considere la biblioteca de objgraph (vea http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks para un ejemplo de caso de uso).

Muppy es (otro) Profiler Usage Profiler para Python. El enfoque de este conjunto de herramientas está en la identificación de las memory leaks.

Muppy intenta ayudar a los desarrolladores a identificar las pérdidas de memoria de las aplicaciones de Python. Permite el seguimiento del uso de la memoria durante el tiempo de ejecución y la identificación de objetos con fugas. Además, se proporcionan herramientas que permiten localizar el origen de los objetos no liberados.

Encontré que las melias son mucho más funcionales que Heapy o PySizer. Si está ejecutando una aplicación web wsgi, Dozer es un bonito contenedor de middleware de Dowser.

Estoy desarrollando un perfilador de memoria para Python llamado memprof:

http://jmdana.github.io/memprof/

Le permite registrar y trazar el uso de memoria de sus variables durante la ejecución de los métodos decorados. Solo tienes que importar la biblioteca usando:

 from memprof import memprof 

Y decora tu método utilizando:

 @memprof 

Este es un ejemplo de cómo se ven las plots:

introduzca la descripción de la imagen aquí

El proyecto está alojado en GitHub:

https://github.com/jmdana/memprof

Pruebe también el proyecto pytracemalloc que proporciona el uso de memoria por número de línea de Python.

EDITAR (2014/04): ahora tiene una GUI Qt para analizar instantáneas.