通过f2py将Fortran扩展到Python:如何进行性能分析?

7
我正在使用一个Python扩展(版本为2.7.2),它是用Fortran编写的(gfortran 4.4.7),并通过f2py(Ver. 2)进行编译。我可以用cProfile对Python部分进行剖析,但结果没有提供任何有关Fortran函数的信息,而是将时间归因于调用Fortran函数的Python函数。我已经为构建的所有Fortran对象启用了“-pg -O”标志,以及通过以下方式通过f2py调用创建共享对象:f2py --opt="-pg -O"...请您帮忙提示如何获得有关Fortran的信息,谢谢!如果有人使用类似的设置,并使用不同的分析器,我也很感兴趣。

就我个人而言,我因为这个原因停止使用f2py了...它很难进入Fortran代码并查看发生了什么。问题在于Fortran代码被C代码包装,使情况更加混乱。 - SethMMorton
也许你应该尝试一下 Pythonic 的方式:在 Python 模块的 if __name__=="__main__": 部分放置测试例程是一个好的实践。因此,我建议编写一个单独的 Fortran 程序以单独分析此部分。 - Stefan
一个Fortran函数调用出现为<ipython-input-51-f4bf36c6a947>:84(<module>)。虽然你无法确定正在被调用的模块,但它可以给你一个想法。另一种方法是将其包装成Python函数,然后查看Python函数的时间。 - ilciavo
@ilciavo 这可能是最好的答案了。你愿意把它作为答案吗?考虑到这个问题已经开放了这么长时间,我可能会接受它。 - NichtJens
3个回答

2
看看这个 Python 扩展分析工具 yep

手册上说使用 ppref 来读取 file.prof 文件。您能简要解释一下如何做吗? - ilciavo
我怀疑 pperf 这个名称是一个打字错误。它可能应该是 pprof(来自 Google 的 perftools)。 - Roland Smith
是的,这取决于google-perftools,但它在64位系统上存在问题。根据其文档:“64位系统上的glibc内置堆栈展开器与perftools库存在一些问题”。因此,我无法使用它。 - Florian

1
一个Fortran函数调用的样子如下:

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

我知道,你无法确定正在调用哪个模块,但至少这会给你一个想法。
另一种方法是将其包装成Python函数,然后查看Python函数的时间。

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

dot -Tjpg callgrind.dot -o callgrind.jpg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接