2010-10-29 13 views
7

Mam aplikację, która składa się z wielu skryptów Pythona. Niektóre z tych skryptów wywołują kod C. Aplikacja działa teraz znacznie wolniej niż była, więc chciałbym ją profilować, aby zobaczyć, gdzie leży problem. Czy istnieje narzędzie, pakiet oprogramowania lub po prostu sposób na profilowanie takiej aplikacji? Narzędzie, które będzie podążać za kodem Pythona do kodu C i profilować również te połączenia?Jak profilować kombinowany python i kod c

Uwaga 1: Doskonale zdaję sobie sprawę ze standardowych narzędzi do profilowania w języku Python. Szczególnie szukam tutaj połączonego profilowania Python/C.

Uwaga 2: moduły Pythona wywołują kod C za pomocą ctypów (szczegóły: patrz http://docs.python.org/library/ctypes.html).

Dzięki!

+0

"wolniej niż było"? Dlaczego więc musisz to zmienić? – joni

+1

@joni: Kod może się zmieniać z wielu różnych powodów. Mogłoby to również spowolnić działanie bez żadnych zmian w kodzie (większe obciążenia, bardziej zajęty serwer, problemy z siecią itp.). –

+0

@joni: ponieważ dokonuję regularnych zmian w tej aplikacji, zarówno w Pythonie, jak iw C, chcę się dowiedzieć, jaka zmiana spowodowała spowolnienie działania kodu. – elesser

Odpowiedz

3

Stackshots praca. Ponieważ połączyłeś Python i C, możesz obsługiwać je osobno. W Pythonie możesz nacisnąć Ctrl-C, gdy powolne jest sprawdzanie stosu. Zrób to kilka razy. To ujawni wszystko, co możesz naprawić w kodzie Pythona. Dla kodu C, uruchom całą sprawę pod debuggerem takim jak GDB i naciśnij Ctrl-C, aby uzyskać śledzenie stosu w C. Kilka z nich ujawni wszystko, co możesz naprawić w kodzie C. Powiedziano mi, że OProfile może to również zrobić. (Innym sposobem jest użycie lsstack, jeśli jest dostępny.)

Jest to mało znana metoda, która działa na tej zasadzie: Załóżmy, że masz nieskończoną pętlę lub prawie nieskończoną pętlę. Jak byś to znalazł? Zatrzymasz program i zobaczysz, co robi, prawda? Załóżmy, że program trwał tylko dwa razy dłużej, niż było to konieczne. Za każdym razem, gdy ją zatrzymałeś, szansa, że ​​złapiesz ją, robiąc niepotrzebne rzeczy, wynosi 50%. Wszystko, co musisz zrobić, to zatrzymać to kilka razy. Jak tylko zobaczysz, że robi coś, co można poprawić, na zaledwie dwóch próbkach, wiesz, że możesz to naprawić, aby uzyskać prawidłowe przyspieszenie. Następnie możesz powtórzyć, aby uzyskać następny problem. Pomiar nie jest celem. Łapanie rzeczy, które możesz poprawić, jest sednem.

+0

Interesujący pomysł. Wypróbuję to w ten weekend. Dzięki. – elesser

1

Połączenie byłoby dość trudne, ale można użyć niektórych standardowych profilerów, takich jak valgrind, gprof lub nawet oprofile (chociaż nigdy nie udało mi się uzyskać z tego znaczące wyniki).

+0

Profiliści, których nie można uzyskać nic przydatnego, wynikają z jednego lub więcej z tych powodów: http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 –

+0

Pytanie związane z @MikeDunlavey został usunięty. – kynan

+0

@kynan: Tak. Sądzę, że jest to kontrowersyjne (choć nie powinno tak być). Kiedy masz wystarczającą liczbę powtórzeń, możesz to zobaczyć. –