2009-09-30 10 views
5

Używam cProfile, pstats i Gprof2dot do profilowania raczej długiego skryptu python.cProfile i Python: Znajdowanie konkretnego numeru wiersza, który kod spędza najwięcej czasu na

Wyniki mówią, że najwięcej czasu spędzam na wywoływanie metody w obiekcie, który zdefiniowałem. Jednak chciałbym wiedzieć dokładnie, jaki numer linii w tej funkcji pochłania czas.

Każdy pomysł, jak uzyskać dodatkowe informacje?

(Nawiasem mówiąc, używam Python 2.6 na OSX irbis czy to pomaga ...)

Odpowiedz

1

Załóżmy, że czas jest „zjadany” jest jakaś liczba, jak 40%. Jeśli po prostu przerwiesz program lub przerwiesz go losowo, prawdopodobieństwo będzie 40% widoczne, dokładnie widoczne na stosie wywołań. Zrób to 10 razy, a na 4 próbkach, +/-, zobaczysz to.

This tells why it works.This is an example.

2

cProfile nie zapisuje numery linii w funkcji; śledzi tylko numer wiersza miejsca, w którym zdefiniowano funkcję.

cProfile próbuje zduplikować zachowanie profile (co jest czystym pythonem). profile używa pstats do przechowywania danych z działania, a pstats zapisuje tylko numery linii dla definicji funkcji, a nie dla pojedynczych instrukcji Pythona.

Jeśli chcesz dowiedzieć się z większą szczegółowością, co je przez cały czas, to musisz przekształcić swoją dużą funkcję w kilka, mniejszych funkcji.

+0

refaktoryzacja na małe funkcje nie zawsze jest możliwa - a wywoływanie funkcji jest kosztowne w pythonie, może to w znaczący sposób wpływać na szybkość. –

+0

+1: Najprościej jest rozbić na mniejsze części. Można również zawijać niektóre bloki do zdefiniowanych lokalnie funkcji czasowych (do profilowania). Pozwoli to nawet na oddzielne połączenia księgowe do tej samej funkcji z różnych miejsc. –

3

Istnieje line profiler w python napisany przez Roberta Kern.

+0

Wygląda na to, czego szukam ... nie mogę jednak zainstalować systemu OS X Snow Leopard, ponieważ szuka pakietu SDK 10.4 (którego nie ma na 10.6). Nie można znaleźć odnośnika w skrypcie kompilacji, aby to zmienić ... Jeśli to pomaga, dokładny komunikat o błędzie pojawia się podczas używania "sudo python setup.py install" to: Kompilacja przy użyciu zestawu SDK, który nie wydaje się być exist: /Developer/SDKs/MacOSX10.4u.sdk –

+0

Nie mam tego problemu na moim macbooku (także na lampartie śnieżnym). Odradzam używanie sudo do instalacji, co często jest złym pomysłem (może złamać twój systemowy python, a sudo nie eksportuje twoich zmiennych env, jak byś tego oczekiwał). Proponuję, aby problem ten pojawił się na liście dyskusyjnej enthought-dev –

Powiązane problemy