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

Posted

技术标签:

【中文标题】有效的 Cython cProfiling 是不是意味着编写许多子函数?【英文标题】:Does effective Cython cProfiling imply writing many sub functions?有效的 Cython cProfiling 是否意味着编写许多子函数? 【发布时间】:2012-06-12 21:35:50 【问题描述】:

我正在尝试使用 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

【问题讨论】:

看起来您最耗时的操作无论如何都涉及对字符串的操作,所以也许您应该专注于通过更有效的算法访问您的字符串。 我正在努力遵循优化的原则,sayeth,如果没有 profileth firsteth,你就不能优化 我正在查看您的个人资料的第一行,这表明您将要进行的任何优化。他们必须来自文件/库? &lt;string&gt;(不太确定是哪个对象)。也就是说,我喜欢你的措辞。 @JeffTratner 请注意,配置文件按名称排序,而不是按时间降序排列。似乎字符串操作占用的时间与调用 mycython.func1 的时间完全相同。 【参考方案1】:

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

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

【讨论】:

谢谢。好的,我查看了 line_profiler,它适用于 python,但是是的,文档没有特别提到使用 with Cython。 Cython 编译器抱怨此分析器需要使用任意 @profile 装饰器。 我赞成你的回答。我将使用额外的功能分离出我的代码,以便使用 cProfile。谢谢。 @HeyWatchThis Robert Kern 的线路分析器does not work with Cython @kynan:Cython 0.23 确实支持线跟踪,appears to work with line_profiler.【参考方案2】:

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

# cython: profile=True

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

【讨论】:

以上是关于有效的 Cython cProfiling 是不是意味着编写许多子函数?的主要内容,如果未能解决你的问题,请参考以下文章

cProfile 没有方法 runcall

Python cProfile:pyo文件是不是可能

我的 python 脚本花时间在哪里?我的 cprofile / pstats 跟踪中是不是存在“丢失时间”?

Cython - 实现回调

如何计算几个 cProfile 结果的平均结果?

cProfiler:如何按执行顺序获取统计信息?