2013-05-14 28 views
7

Używam rozszerzenia do Pythona (2.7.2) napisanego w Fortranie (gfortran 4.4.7) skompilowanego przez f2py (wer. 2).Rozszerzenie Fortran do Pythona przez f2py: Jak profilować?

Mogę profilować część Pythona za pomocą cProfile, ale wynik nie daje żadnych informacji o funkcjach Fortran. Zamiast tego czas jest przypisywany do funkcji Pythona wywołującej funkcję Fortran.

I umożliwiły „-pg -O” flagi dla wszystkich obiektów Fortran buduję, jak również w zaproszeniu f2py tworzącego obiekt udostępniony poprzez: f2py --opt="-pg -O" ...

wszelkie podpowiedzi, w jaki sposób uzyskać Informacje Fortran też są bardzo cenione.

Jeśli ktoś używa podobnej konfiguracji, z innym profilerem, również byłbym zainteresowany.

+0

FWIW, przestałem używać f2py z tego powodu ... trudno jest wejść i zobaczyć, co dzieje się w kodzie Fortrana. Problem polega na tym, że kod Fortrana jest zawijany za pomocą kodu C, co dodatkowo utrudnia sytuację. – SethMMorton

+0

Może powinieneś wypróbować go w trybie pytonowym: dobrą praktyką jest umieszczanie procedur testowych w 'if __name __ ==" __ main __ ":' części modułów python. Proponuję więc napisać oddzielny program Fortran, aby profilować tę część osobno. – Stefan

+0

Wywołanie funkcji Fortran pojawia się jako ': 84 ()'. To prawda, że ​​nie możesz określić, który moduł jest wywoływany, ale daje ci to pomysł. Innym sposobem jest zawarcie go w funkcji Pythona, a następnie zobaczenie czasu dla funkcji Pythona. – ilciavo

Odpowiedz

1

Fortran wywołanie funkcji pojawia się jako:

<ipython-input-51-f4bf36c6a947>:84(<module>). 

wiem, nie można zidentyfikować, który moduł jest nazywany ale przynajmniej to daje wyobrażenie.

Innym sposobem jest zawijanie go do funkcji Pythona, a następnie sprawdzanie czasu dla funkcji Pythona.

1

Zobacz profilera rozszerzenia python yep.

+0

W instrukcji opisano użycie 'ppref' do odczytu' file.prof'. Czy mógłbyś krótko wyjaśnić, jak to zrobić? – ilciavo

+0

Podejrzewam, że nazwa 'pperf' jest literówką. Może prawdopodobnie powiedzieć "pprof" (z [perftools] firmy Google (http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html)) –

+0

Tak, zależy to od google-perftools, które ma problem z 64 bitami systemy. Z jego dokumentu: "Wbudowany w Glibc mechanizm odwijania stosów w 64-bitowych systemach ma pewne problemy z bibliotekami perftools". Z tego powodu nie mogłem go użyć. – Florian

0

Ten przepływ pracy wydaje się działać całkiem dobrze:

    1. Zastosowanie callgrind do profilowania kodu (ten generuje plik jak callgrind.out.27237):

valgrind --tool = callgrind python my_python_script_calling_f2py_functions.py arg1 arg2

gprof2dot -f callgrind callgrind.out.27237> callgrind.dot

dot -Tjpg callgrind.dot -o callgrind.jpg