2010-12-28 12 views
21

Użyłem kiedyś ładnego profilera Apple, który jest wbudowany w aplikację Monitora systemu. Dopóki twój kod C++ został skompilowany z informacjami debugowania, możesz wypróbować działającą aplikację i wydrukować drzewo z wcięciem informujące o tym, ile procent czasu funkcji nadrzędnej zostało zużytych w tej funkcji (i ciało w porównaniu z innymi wywołaniami funkcji) .Jak uzyskać drzewo wywołań z profilerami Pythona?

Na przykład, jeśli główny zwany function_1 i function_2, function_2 rozmowy function_3, a następnie główne rozmowy function_3:

main (100%, 1% in function body): 
    function_1 (9%, 9% in function body): 
    function_2 (90%, 85% in function body): 
     function_3 (100%, 100% in function body) 
    function_3 (1%, 1% in function body) 

chciałbym to zobaczyć i pomyśleć: „Coś trwa długo w kodzie w body of function_2. Jeśli chcę, aby mój program był szybszy, to tam powinienem zacząć. "

Czy ktoś wie, jak mogę najłatwiej uzyskać dokładne wyniki profilowania dla programu Pythona?

Widziałem ludzi powiedzieć, aby to zrobić:

import cProfile, pstats 
prof = cProfile.Profile() 
prof = prof.runctx("real_main(argv)", globals(), locals()) 
stats = pstats.Stats(prof) 
stats.sort_stats("time") # Or cumulative 
stats.print_stats(80) # 80 = how many to print 

ale to dość niechlujny w porównaniu do tego eleganckiego drzewa połączeń. Daj mi znać, jeśli możesz to łatwo zrobić, to trochę pomogłoby.

Pozdrawiam!

Odpowiedz

9

Sprawdź tę bibliotekę http://pycallgraph.slowchop.com/ dla wykresów połączeń. Działa bardzo dobrze. Jeśli chcesz profilować określone funkcje, sprawdź, czy jest to wynik z modułu profilehooks.

alt text

+0

Wiesz, jeśli ten pakiet może nie upłynął czas, jak również liczbę wywołań funkcji? Na przykład, nie miałbym nic przeciwko wywołaniu __hash __() tysięcy razy, ale wywoływanie sorted() wielokrotnie na dużych listach może być dość powolne. – user

+0

Powinieneś po prostu wypróbować je na obu. Zasadniczo robią to samo na różne sposoby z różnymi wyjściami. – Falmarri

+0

+1, pakiet jest zgodny z tym, co miałem na myśli i był szybki i łatwy w instalacji i wywołaniu. Czy możesz powiedzieć mi, jak masz powyższą figurę? Zrobiłem wykres (używając pycallgraph.start_trace() i pycallgraph.make_dot_graph ("test.jpg", format = 'jpg', tool = 'neato') ), ale jest zbyt tłoczno i ​​wiele funkcji jest zasłoniętych. – user

15

Niedawno chciał to samo, więc wziął ukłucie w realizacji jednego siebie.

Projekt na Github. https://github.com/joerick/pyinstrument

Oto jak można go używać:

from pyinstrument import Profiler 

profiler = Profiler() 
profiler.start() 

# code you want to profile 

profiler.stop() 

print(profiler.output_text()) 
+1

To jest fantastyczne, dziękuję! – Maximilian

+0

Wydaje mi się, że jest tutaj taka, która jest bardziej ogólną biblioteką: https://github.com/vmprof/vmprof-python – dashesy

+1

To jest naprawdę fajne, dziękuję! – Dakkaron

38

Właśnie natknąłem się na ten temat, jak również i spędził trochę czasu na nauczenie się wygenerować wykres rozmowy (normalne wyniki cProfile nie jest strasznie informacyjny). Przyszłe referencje, oto kolejny sposób na wygenerowanie pięknej grafiki drzewa wywołań za pomocą cProfile + gprof2dot + graphViz.

-------

  1. Install Graphviz: http://www.graphviz.org/Download_macos.php
  2. easy_install gprof2dot
  3. profil działać na kodzie.

    python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ... 
    
  4. Run gprof2dot przekształcić profil połączeń do pliku dot

    gprof2dot -f pstats myLog.profile -o callingGraph.dot 
    
  5. Otwórz z Graphviz wizualizacji wykresu

Oto co wynik końcowy będzie wyglądać! Wykres jest oznaczony kolorami - czerwony oznacza większą koncentrację czasu.

Graph is color-coded- red means higher concentration of time

+4

[xdot] (https://pypi.python.org/pypi/xdot) to łatwa interaktywna przeglądarka plików .dot, która umożliwia powiększanie zawartości. –

+2

Może wyświetlać plik .dot w systemie Unix za pomocą polecenia powłoki, takiego jak "dot callingGraph.dot -Tpng | display" zamiast kroku 5. – benjimin

+1

Świetna odpowiedź, dokładnie to, czego szukałem, dzięki! –

Powiązane problemy