2013-05-14 41 views
7

我在使用f2py(Ver.2)編譯的Fortran(gfortran 4.4.7)中編寫的擴展名爲Python(2.7.2)。通過f2py Fortran擴展到Python:如何配置文件?

我可以使用cProfile來剖析Python部分,但結果並不提供有關Fortran函數的任何信息。相反,時間歸因於調用Fortran函數的Python函數。

我已經啓用了「-pg O」標誌爲我打造,以及在f2py呼叫通過創建共享對象的所有的Fortran對象:f2py --opt="-pg -O" ...

如何得到任何提示Fortran信息也非常感謝。

如果有人使用類似的設置,使用不同的分析器,我也會感興趣。

+0

FWIW,因爲這個原因,我停止使用f2py ......很難進入Fortran代碼,看看發生了什麼。問題在於Fortran代碼被C代碼包裝,進一步混淆了這種情況。 – SethMMorton 2013-05-14 18:23:59

+0

也許你應該試試pythonic方法:將測試例程放在Python模塊的'if __name __ =='__ main __「:'部分是一個好習慣。所以我建議編寫一個單獨的Fortran程序來分別描述這個部分。 – Stefan 2013-05-15 06:39:10

+0

Fortran函數調用顯示爲':84()'。確實,你無法確定哪個模塊被調用,但它給了你一個想法。另一種方法是將其封裝到Python函數中,然後查看Python函數的時間。 – ilciavo 2015-06-23 16:42:50

回答

1

的Fortran函數調用顯示爲:

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

我知道,你不能確定被稱爲該模塊,但至少這給你的想法。

另一種方式是將其封裝到Python函數中,然後查看Python函數的計時。

1

看看python擴展profiler yep

+0

該手冊說使用'ppref'來讀取'file.prof'。你能簡單解釋一下怎麼做嗎? – ilciavo 2015-06-23 16:46:14

+0

我懷疑'pperf'這個名字是一個錯字。它可能會說'pprof'(來自Google的[perftools](http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html)) – 2015-06-24 18:47:45

+0

yep依賴於google-perftools,它有64位的問題系統。從它的文檔:「在64位系統上的glibc內置堆棧解卷器在perftools庫中存在一些問題」。出於這個原因,我無法使用它。 – Florian 2017-07-10 09:10:25

0

這個工作流程似乎工作得很好:

    1. 使用callgrind分析代碼(這會產生像callgrind.out.27237文件):

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

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

點-Tjpg callgrind.dot -o callgrind。jpg