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?
źródło
pstats.print_callers
. Przykładem jest tutaj .Odpowiedzi:
Uważam, że właśnie do tego służy line_profiler Roberta Kerna . Z linku:
Mam nadzieję, że to pomoże!
źródło
import line_profiler;
i wtedy ?Można również użyć pprofile ( PyPI ). Jeśli chcesz sprofilować całe wykonanie, nie wymaga to modyfikacji kodu źródłowego. Możesz również profilować podzbiór większego programu na dwa sposoby:
przełącz profilowanie po osiągnięciu określonego punktu w kodzie, takiego jak:
przełączanie profilowania asynchronicznie ze stosu wywołań (wymaga sposobu wyzwolenia tego kodu w rozważanej aplikacji, na przykład programu obsługi sygnału lub dostępnego wątku roboczego) przy użyciu profilowania statystycznego:
Format wyjściowy adnotacji do kodu jest podobny do programu profilującego:
Zauważ, że ponieważ pprofile nie polega na modyfikacji kodu, może profilować instrukcje modułów najwyższego poziomu, pozwalając na profilowanie czasu uruchamiania programu (jak długo trwa import modułów, inicjalizacja globalnych, ...).
Może generować dane wyjściowe w formacie cachegrind, więc możesz użyć kcachegrind do łatwego przeglądania dużych wyników.
Ujawnienie: jestem autorem profilu.
źródło
Możesz skorzystać z pomocy line_profiler pakietu
1. 1. zainstaluj pakiet:
2. Użyj magicznego polecenia, aby załadować pakiet do środowiska Python / notebook
3. Jeśli chcesz profilować kody dla funkcji,
wykonaj następujące czynności:
otrzymasz ładne sformatowane wyjście ze wszystkimi szczegółami, jeśli wykonasz te kroki :)
źródło
Tylko po to, aby poprawić wyżej wymienioną odpowiedź @Joe Kingtona .
W przypadku Pythona 3.x użyj line_profiler :
Instalacja:
Stosowanie:
Przypuśćmy, że masz program,
main.py
aw nim funkcjefun_a()
ifun_b()
chcesz profilować w czasie; będziesz musiał użyć dekoratora@profile
tuż przed definicjami funkcji. Np.Program można sprofilować wykonując polecenie powłoki:
Argumenty można pobrać za pomocą
$ kernprof -h
Wyniki zostaną wydrukowane na konsoli jako:
EDYCJA: Wyniki z profilerów można analizować za pomocą pakietu TAMPPA . Używając go, możemy uzyskać żądane wykresy linia po linii jako
źródło
PyVmMonitor ma podgląd na żywo, który może Ci w tym pomóc (możesz połączyć się z uruchomionym programem i uzyskać z niego statystyki).
Zobacz: http://www.pyvmmonitor.com/
źródło