【问题标题】:Fortran extension to Python via f2py: How to profile?通过 f2py 对 Python 的 Fortran 扩展:如何分析?
【发布时间】:2013-05-08 20:03:23
【问题描述】:

我正在使用通过 f2py(版本 2)编译的 Fortran (gfortran 4.4.7) 编写的 Python (2.7.2) 扩展。

我可以使用cProfile 分析 Python 部分,但结果没有提供有关 Fortran 函数的任何信息。相反,时间归因于调用 Fortran 函数的 Python 函数。

我已为我构建的所有 Fortran 对象启用“-pg -O”标志,以及在 f2py 调用中通过以下方式创建共享对象:f2py --opt="-pg -O" ...

非常感谢任何有关如何获取 Fortran 信息的提示。

如果有人使用类似的设置,使用不同的分析器,我也会感兴趣。

【问题讨论】:

  • FWIW,我停止使用 f2py 是因为这个原因......很难进去看看 Fortran 代码中发生了什么。问题是 Fortran 代码是用 C 代码包装的,进一步混淆了情况。
  • 也许你应该尝试一下 python 的方式:将测试例程放在 python 模块的if __name__=="__main__": 部分是一个好习惯。所以我建议编写一个单独的 Fortran 程序来单独分析这部分。
  • Fortran 函数调用显示为<ipython-input-51-f4bf36c6a947>:84(<module>)。确实,您无法确定正在调用哪个模块,但它给了您一个想法。另一种方法是将其包装到 Python 函数中,然后查看 Python 函数的时序。
  • @ilciavo 这可能是最好的答案。你介意让它成为一个答案吗?我可能会接受它(考虑到这个问题已经开放的时间;-))。

标签: python fortran profiler f2py cprofile


【解决方案1】:

Fortran 函数调用显示为:

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

我知道,您无法确定正在调用哪个模块,但至少这让您有所了解。

另一种方法是将其包装到 Python 函数中,然后查看 Python 函数的时序。

【讨论】:

    【解决方案2】:

    看看python扩展分析器yep

    【讨论】:

    • 手册说使用ppref来阅读file.prof。能否请您简要解释一下如何做到这一点?
    • 我怀疑pperf 这个名字是一个错字。它可能会说pprof(来自谷歌的perftools
    • 是的,这取决于 google-perftools,它与 64 位系统有问题。来自其文档:“64 位系统上的 glibc 内置堆栈展开器与 perftools 库存在一些问题”。由于这个原因,我无法使用它。
    【解决方案3】:

    这个工作流程似乎运作良好:

      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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2014-09-12
      • 2013-11-11
      相关资源
      最近更新 更多