有效的 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,你就不能优化 我正在查看您的个人资料的第一行,这表明您将要进行的任何优化。他们必须来自文件/库?<string>
(不太确定是哪个对象)。也就是说,我喜欢你的措辞。
@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 withline_profiler
.【参考方案2】:
您需要为您的 Cython 代码启用分析支持。使用
# cython: profile=True
http://docs.cython.org/src/tutorial/profiling_tutorial.html
【讨论】:
以上是关于有效的 Cython cProfiling 是不是意味着编写许多子函数?的主要内容,如果未能解决你的问题,请参考以下文章