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

Python 有效的Cython cProfiling是否意味着编写许多子函数?,python,optimization,profiling,cython,cprofile,Python,Optimization,Profiling,Cython,Cprofile,我试图用Cython优化一些代码,但是cProfile没有提供足够的信息 为了做好评测工作,我应该创建许多子例程func2、func3、,40岁 请注意,我在mycython.pyx中有一个函数func1,但它有许多for循环和内部操作。但是cProfile并没有告诉我这些循环的统计数据 2009 function calls in 81.254 CPU seconds Ordered by: standard name ncalls tottime percall cumt

我试图用Cython优化一些代码,但是cProfile没有提供足够的信息

为了做好评测工作,我应该创建许多子例程func2、func3、,40岁

请注意,我在
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}
2009函数调用在81.254 CPU秒内完成
订购人:标准名称
ncalls tottime percall cumtime percall文件名:lineno(函数)
1    0.000    0.000   81.254   81.254 :1()
2 0.000 0.000 0.021 0.010布拉赫比:1495(透镜)
2000 0.000 0.000 0.000 0.000布拉赫比:1498
1 0.214 0.214 0.214 0.214 mycython.pyx:718(func2)
180.98180.98181.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{方法'disable'的''lsprof.Profiler'对象}

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


如果您想要更细粒度的分析(行级别),那么您需要一个不同的分析程序。请看一看,但我认为它不适用于Cython。

您需要为Cython代码启用评测支持。使用

# cython: profile=True

看起来,您最耗时的操作涉及到字符串的操作,因此,您可能应该专注于通过更高效的算法访问字符串。sayeth说,我试图遵循优化原则,首先,我只是看一下你的个人资料的第一行,这表明无论你要做什么样的优化。它们必须来自文件/库<代码>(不太确定是哪个对象)。也就是说,我喜欢你的措辞方式。@Jeffratner注意到个人资料是按姓名排序的,而不是按时间降序排列的。字符串操作占用的时间似乎与调用
mycython.func1
的时间完全相同。谢谢。好的,我看了一下line_profiler,它在python中运行得很好,但是是的,文档中没有特别提到与Cython一起使用。Cython编译器抱怨这个分析器需要使用任意的@profile decorator。我对你的答案投了赞成票。我将用额外的函数分离出我的代码,用cProfile工作。谢谢。@HeyWatchThis Robert Kern的测线分析器@kynan:Cython 0.23支持测线跟踪,并且。