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


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 más memoria. La búsqueda de Google muestra una comercial Validador de memoria Python (Solo Windows).

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

No he probado con nadie, 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 el mínimo o ningún cambio en mi código.


577
2017-09-21 04:43


origen


Respuestas:


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 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 son un poco escasos.

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


255
2017-09-21 11:45



Como nadie lo ha mencionado, apuntaré a mi módulo memory_profiler que es capaz de imprimir el informe línea por línea del uso de la memoria y funciona en Unix y Windows (necesita psutil en este último). La salida no es muy detallada, pero el objetivo es brindarle una visió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 tu función con @profile y ejecutando su código con el -m memory_profiler marcará 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

287
2018-05-14 22:51



yo 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 la lista de objetos en vivo, ver referencias a objetos en vivo, todo desde la interfaz web simple.

# 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)

Usted importa memdebug, y llama a memdebug.start. Eso es todo.

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

ACTUALIZAR

El código anterior es para CherryPy 2.X, CherryPy 3.X el server.quickstart método ha sido eliminado y engine.start no toma el blocking bandera. Entonces, 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()

78
2017-09-21 04:50



Considera el Objgraph biblioteca (ver http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks para un ejemplo de caso de uso).


59
2017-10-27 19:41



Muppy es (otro más) Profiler de uso de memoria para Python. El objetivo de este conjunto de herramientas es la identificación de fugas de memoria.

Muppy intenta ayudar a los desarrolladores a identificar fugas 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 los objetos que tienen fugas. Además, se proporcionan herramientas que permiten ubicar la fuente de objetos no publicados.


15
2018-03-11 14:17



encontré Meliae ser mucho más funcional que Heapy o PySizer. Si está ejecutando una aplicación web wsgi, entonces Dormilón es un buen envoltorio de middleware de Dowser


11
2017-10-25 21:31



Estoy desarrollando un perfil 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 tiene que importar la biblioteca usando:

from memprof import memprof

Y decora tu método usando:

@memprof

Este es un ejemplo de cómo son las parcelas:

enter image description here

El proyecto está alojado en GitHub:

https://github.com/jmdana/memprof


8
2017-07-03 12:12



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

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


5
2017-09-04 22:56