有效的Cython cProfile是否意味着编写许多子函数?



我正在尝试使用Cython优化一些代码,但cProfile没有提供足够的信息。

为了做好分析工作,我是否应该创建许多子例程 func2、func3,... ,func40 ?

请注意,我在mycython.pyx中有一个func1函数,但它有很多 for 循环和内部操作。但是cProfile没有告诉我这些循环的统计数据。

     2009 function calls in 81.254 CPU seconds
Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000   81.254   81.254 <string>:1(<module>)
    2    0.000    0.000    0.021    0.010 blah.py:1495(len)
 2000    0.000    0.000    0.000    0.000 blah.py:1498(__getitem__)
    1    0.214    0.214    0.214    0.214 mycython.pyx:718(func2)
    1   80.981   80.981   81.216   81.216 mycython.pyx:743(func1)
    1    0.038    0.038   81.254   81.254 {mycython.func1}
    2    0.021    0.010    0.021    0.010 {len}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

是的,确实如此。cProfile可用的最精细粒度是函数调用。您必须将 func1 拆分为多个函数。(请注意,您可以使它们在 func1 中定义,因此仅适用于 func1。

如果需要更细粒度的分析(线级),则需要不同的性能分析器。看看这个行级探查器,但我认为它不适用于 Cython。

您需要为 Cython 代码启用分析支持。用

# cython: profile=True

http://docs.cython.org/src/tutorial/profiling_tutorial.html

最新更新