it-swarm-eu.dev

Který profil profilů Python je doporučen?

Chci znát využití paměti mé aplikace Python a konkrétně chci vědět, které bloky kódu, části nebo objekty spotřebovávají nejvíce paměti. Hledání Google ukazuje, že komerční je Python Memory Validator (pouze Windows).

A ty s otevřeným zdrojovým kódem jsou PySizer a Heapy .

Nikoho jsem nezkoušel, tak jsem chtěl vědět, který z nich je nejlepší zvažovat:

  1. Poskytuje nejvíce podrobností.

  2. Musím udělat nejméně nebo žádné změny svého kódu.

636
Anurag Uniyal

Heapy je docela jednoduché použití. V určitém okamžiku kódu musíte napsat následující:

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

Takto získáte výstup jako je tento:

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)

Můžete také zjistit, odkud jsou objekty odkazovány, a získat o tom statistiky, ale dokumenty, které jsou v nich nějakým způsobem rozptýlené.

K dispozici je také grafický prohlížeč, psaný v Tk.

270
Torsten Marek

Protože to nikdo nezmínil, ukážu na svůj modul memory_profiler , který umí tisknout řádek po řádku zprávu o využití paměti a pracuje na Unixu a Windows (na tomto posledním potřebuje psutil). Výstup není příliš podrobný, ale jeho cílem je poskytnout vám přehled o tom, kde kód spotřebovává více paměti a ne vyčerpávající analýzu přidělených objektů.

Po zdobení vaší funkce pomocí @profile a spuštění kódu s příznakem -m memory_profiler se vytiskne zpráva po řádku takto:

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
331
Fabian Pedregosa

Doporučuji Dowser . Nastavení je velmi snadné a potřebujete nulové změny kódu. Můžete prohlížet počet objektů každého typu v čase, zobrazit seznam živých objektů, zobrazit odkazy na živé objekty, vše z jednoduchého webového rozhraní.

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

Importujete memdebug a voláte memdebug.start. To je vše.

Nezkoušel jsem PySizer nebo Heapy. Ocenil bych recenze ostatních.

AKTUALIZACE

Výše uvedený kód je pro CherryPy 2.X, CherryPy 3.X metoda server.quickstart byla odstraněna a engine.start nepřijímá příznak blocking. Pokud tedy používáte 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()
80
sanxiyn

Zvažte knihovnu objgraph (viz http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks pro příklad použití).

64
Charles Duffy

Muppy je (ještě další) Profiler využití paměti pro Python. Tato sada nástrojů se zaměřuje na identifikaci úniků paměti.

Muppy se snaží vývojářům pomoci při úniku paměti aplikací Python. Umožňuje sledovat využití paměti během běhu a identifikovat unikající objekty. Dále jsou k dispozici nástroje, které umožňují lokalizovat zdroj neuvedených objektů.

16
Serrano

Zjistil jsem, že meliae je mnohem funkčnější než Heapy nebo PySizer. Pokud náhodou používáte webový wsgi, pak Dozer je pěkný middlewarový obal Dowser

12
Calen Pennington

Vyvíjím paměťový profiler pro Python zvaný memprof:

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

To vám umožní protokolovat a vykreslit využití paměti vašich proměnných během provádění dekorovaných metod. Musíte pouze importovat knihovnu pomocí:

from memprof import memprof

A ozdobte svou metodu pomocí:

@memprof

Toto je příklad, jak grafy vypadají:

enter image description here

Projekt je hostován v GitHubu:

https://github.com/jmdana/memprof

10
jmdana

Vyzkoušejte také projekt pytracemalloc , který poskytuje využití paměti na Python číslo řádku.

EDIT (2014/04): Nyní má rozhraní Qt GUI pro analýzu snímků.

8
haypo