¿Qué perfilador de memoria de Python se recomienda? [cerrado]

Resuelto Anurag Uniyal asked hace 16 años • 8 respuestas

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:

  1. Da la mayoría de los detalles.

  2. Tengo que hacer mínimos o ningún cambio en mi código.

Anurag Uniyal avatar Sep 21 '08 11:09 Anurag Uniyal
Aceptado

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 @profiley ejecutar su código con la -m memory_profilerbandera, 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
Fabian Pedregosa avatar May 14 '2012 22:05 Fabian Pedregosa

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 .

Torsten Marek avatar Sep 21 '2008 11:09 Torsten Marek

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.Xel server.quickstartmétodo se eliminó y engine.startno acepta la blockingbandera. 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()
sanxiyn avatar Sep 21 '2008 04:09 sanxiyn

Considere la biblioteca objgraph (consulte esta publicación de blog para ver un caso de uso de ejemplo).

Charles Duffy avatar Oct 27 '2009 19:10 Charles Duffy

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.

Serrano avatar Mar 11 '2013 14:03 Serrano