【发布时间】: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