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

时间:2012-06-12 21:35:50

标签: python optimization profiling cython cprofile

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

为了做好分析,我应该创建许多子例程func2,func3,...,func40吗?

下面注意我在func1中有一个函数mycython.pyx,但它有许多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}

2 个答案:

答案 0 :(得分:4)

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

如果您想要更精细的分析(行级),那么您需要一个不同的分析器。看看this line-level profiler,但我认为它不适用于Cython。

答案 1 :(得分:4)

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

# cython: profile=True

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