¿Qué perfilador de memoria de Python se recomienda? [cerrado]
Quiero saber el uso de memoria de mi aplicación Python y específicamente quiero saber qué bloques/porciones de código u objetos consumen más memoria. La búsqueda de Google muestra uno comercial: Python Memory Validator (solo Windows).
Y los de código abierto son PySizer y Heapy .
No he probado ninguno, así que quería saber cuál es el mejor teniendo en cuenta:
Da la mayoría de los detalles.
Tengo que hacer mínimos o ningún cambio en mi código.
Mi módulo Memory_profiler es capaz de imprimir un informe línea por línea del uso de la memoria y funciona en Unix y Windows (necesita psutil en este último). El resultado no es muy detallado, pero el objetivo es brindarle una descripción general de dónde el código consume más memoria, no un análisis exhaustivo de los objetos asignados.
Después de decorar su función @profile
y ejecutar su código con la -m memory_profiler
bandera, 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
guppy3 es bastante sencillo de usar. En algún punto de tu código, debes escribir lo siguiente:
from guppy import hpy
h = hpy()
print(h.heap())
Esto le da un resultado como este:
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 al respecto, pero de alguna manera los documentos al respecto son un poco escasos.
También hay un navegador gráfico, escrito en Tk.
Para Python 2.x, utilice Heapy .
Recomiendo zahorí . Es muy fácil de configurar y no necesita cambios en su código. Puede ver recuentos de objetos de cada tipo a lo largo del tiempo, ver una lista de objetos vivos, ver referencias a objetos vivos, 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)
Importas memdebug y llamas a memdebug.start. Eso es todo.
No he probado PySizer ni Heapy. Agradecería las opiniones de otros.
ACTUALIZAR
El código anterior es para CherryPy 2.X
, CherryPy 3.X
el server.quickstart
método se eliminó y engine.start
no acepta la blocking
bandera. Así que si estás usandoCherryPy 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 objgraph (consulte esta publicación de blog para ver un caso de uso de ejemplo).
Muppy es (otro) generador de perfiles de uso de memoria para Python. El objetivo de este conjunto de herramientas se centra en la identificación de pérdidas de memoria.
Muppy intenta ayudar a los desarrolladores a identificar las pérdidas de memoria de las aplicaciones 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.