Który Profiler pamięci Pythona jest zalecany? [zamknięte]

Chcę poznać wykorzystanie pamięci w mojej aplikacji Pythona, a konkretnie chcę wiedzieć, jakie bloki/części kodu lub obiekty zużywają najwięcej pamięci. Wyszukiwarka Google pokazuje, że komercyjny to walidator pamięci Pythona (Tylko Windows).

I open source to PySizer i Heopy .

Nie próbowałem nikogo, więc chciałem wiedzieć, który z nich jest najlepszy:

  1. Podaje najwięcej szczegółów.

  2. Muszę to zrobić. najmniej lub bez zmian w moim kodzie.

Author: Aaron Hall, 2008-09-21

8 answers

Heopy jest dość prosty w użyciu. W pewnym momencie w kodzie musisz napisać:

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

To daje jakieś wyjście w ten sposób:

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)

Możesz również dowiedzieć się, z którego miejsca odwołują się obiekty i uzyskać statystyki na ten temat, ale jakoś dokumenty na ten temat są trochę rzadkie.

Istnieje również graficzna przeglądarka, napisana w Tk.

 260
Author: Torsten Marek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-22 19:51:07

Ponieważ nikt o tym nie wspomniał, wskażę mój Moduł memory_profiler , który jest w stanie drukować wiersz po wierszu raport zużycia pamięci i działa na Unixie i Windows (potrzebuje psutil na tym ostatnim). Dane wyjściowe nie są zbyt szczegółowe, ale celem jest pokazanie, gdzie kod zużywa więcej pamięci, a nie wyczerpująca analiza przydzielonych obiektów.

Po zdobieniu funkcji @profile i uruchomieniu kodu z flagą -m memory_profiler wydrukuje raport liniowy w ten sposób:

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
 297
Author: Fabian Pedregosa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-30 14:37:42

Polecam Dowser. Jest bardzo łatwy w konfiguracji i nie potrzebujesz żadnych zmian w kodzie. Możesz przeglądać liczbę obiektów każdego typu w czasie, wyświetlać listę aktywnych obiektów, wyświetlać odniesienia do aktywnych obiektów, wszystko z prostego interfejsu internetowego.

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

Importujesz memdebug i wywołujesz memdebug.zaczynaj. To wszystko.

Nie próbowałem PySizer ani Heopy. Byłbym wdzięczny za opinie innych.

UPDATE

Powyższy kod jest dla CherryPy 2.X, CherryPy 3.X na server.quickstart metoda została usunięta i engine.start nie przyjmuje znacznika blocking. Więc jeśli używasz 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()
 79
Author: sanxiyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-13 09:16:05

Rozważmy bibliotekę objgraph (Zobacz http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks dla przykładowego przypadku użycia).

 60
Author: Charles Duffy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 19:41:40

Muppy to (kolejny) Profiler użycia pamięci dla Pythona. Ten zestaw narzędzi skupia się na identyfikacji wycieków pamięci.

Muppy stara się pomóc programistom w identyfikacji wycieków pamięci aplikacji Pythona. Umożliwia śledzenie wykorzystania pamięci w czasie wykonywania i identyfikację obiektów, które są nieszczelne. Dodatkowo dostępne są narzędzia, które pozwalają zlokalizować źródło nie zwalnianych obiektów.

 15
Author: Serrano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-11 14:17:42

Znalazłem meliae jest znacznie bardziej funkcjonalny niż Heopy lub PySizer. Jeśli zdarzy ci się uruchomić wsgi webapp, to Dozer jest ładnym opakowaniem Middleware z Dowser

 11
Author: Calen Pennington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-25 21:31:15

Rozwijam Profiler pamięci dla Pythona o nazwie memprof:

Http://jmdana.github.io/memprof/

Pozwala na rejestrowanie i rysowanie wykorzystania pamięci zmiennych podczas wykonywania dekorowanych metod. Wystarczy zaimportować bibliotekę używając:

from memprof import memprof

I udekoruj swoją metodę używając:

@memprof

To jest przykład jak wyglądają działki:

Tutaj wpisz opis obrazka

Projekt jest hostowany w GitHub:

Https://github.com/jmdana/memprof

 8
Author: jmdana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-03 12:12:50

Wypróbuj również projekt pytracemalloc , który zapewnia zużycie pamięci na numer linii Pythona.

EDIT (2014/04): teraz ma Qt GUI do analizy migawek.

 5
Author: haypo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-03 14:49:24