【问题标题】:How to profile cython code called by another python script?如何分析另一个python脚本调用的cython代码?
【发布时间】:2020-01-19 05:48:31
【问题描述】:
$ cat calc_pi.pyx
# cython: profile=True
# cython: language_level=3
# cython linetrace=True

# calc_pi.pyx

cimport cython

@cython.profile(False)
def recip_square(int i):
    return 1. / i ** 2

def approx_pi(int n=10000000):
    cdef double val = 0.
    cdef int k
    for k in range(1, n + 1):
        val += recip_square(k)
    return (6 * val) ** .5

$ cat runme.py
import calc_pi
import argparse

def main():
    parser = argparse.ArgumentParser(prog='{0}'.format(__file__))
    parser.add_argument("-i", "--index", help="specify number", type=int)
    args = parser.parse_args()
    num = int(args.index)
    print(calc_pi.approx_pi(num))

if __name__ == "__main__":
    main()

问题> 我已经看到如何分析单个 cython 函数,例如 calc_pi.approx_pi。但是,我无法通过调用 python 脚本来分析这些函数。

例如,假设您不能直接分析函数calc_pi.approx_pi,因为您需要来自python脚本的一些参数/预处理(即runme.py)。

有没有一种方法可以通过调用runme.py 来分析calc_pi.approx_pi

谢谢

【问题讨论】:

  • 直接配置 Cython 函数(docs.cython.org/en/latest/src/tutorial/…)
  • 我并没有真正使用过 Cython 分析,但是你有没有尝试过标准的python -m cProfile runme.py --arguments --more-arguments --something=1
  • @DavidW,我之前尝试过 cProfile。它只为 .py 中定义的所有函数生成分析。结果中没有显示 pyx 中的函数。
  • 如果我复制您的示例,使用cythonize-3.6 -i calc_pi.pyx 编译它,然后使用python3 -m cProfile runme.py -i50000000 运行它,我会得到一个包含approx_pi 的输出(占用大部分运行时间)。不幸的是,如果这对你不起作用,我不知道为什么......

标签: cython


【解决方案1】:

这是一个相当老的问题,但我遇到了同样的问题,所以我认为发布对我有用的内容可能很有用。

# cython: profile=True 开始您的 Cython 脚本(正如您已经完成的那样),在您的 Python 脚本中,import cProfile 然后 cProfile.run('cython_function(arguments)').

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多