Używałem cProfile do profilowania mojego kodu i działa świetnie. Ja też używam gprof2dot.py do wizualizacji wyników (czyni to trochę jaśniejszym).
Jednak cProfile (i większość innych profilerów Pythona, które widziałem do tej pory) wydaje się profilować tylko na poziomie wywołania funkcji. Powoduje to zamieszanie, gdy pewne funkcje są wywoływane z różnych miejsc - nie mam pojęcia, czy wywołanie nr 1, czy nr 2 zajmuje większość czasu. Sytuacja jest jeszcze gorsza, gdy dana funkcja ma sześć poziomów głębokości i jest wywoływana z siedmiu innych miejsc.
Jak uzyskać profilowanie linia po linii?
Zamiast tego:
function #12, total time: 2.0s
Chciałbym zobaczyć coś takiego:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile pokazuje, ile z łącznego czasu „przenosi” do rodzica, ale znowu to połączenie jest tracone, gdy masz kilka warstw i połączonych ze sobą połączeń.
Najlepiej byłoby mieć GUI, który przeanalizowałby dane, a następnie pokazałby mój plik źródłowy z całkowitym czasem podanym dla każdej linii. Coś takiego:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Następnie mógłbym kliknąć drugie wywołanie „func (c)”, aby zobaczyć, co zajmuje czas w tym wywołaniu, niezależnie od wywołania „func (a)”.
Czy to ma sens? Czy istnieje biblioteka profili, która gromadzi tego typu informacje? Czy jest jakieś niesamowite narzędzie, które przegapiłem?
pstats.print_callers
. Przykładem jest tutaj .