2011-02-24 59 views
2

我想知道为什么某些函数需要很长时间才能完成。
我使用探查这样的:Python分析器没有提供足够的信息

ipdb> import profile 
ipdb> profile.runctx('report.generateOutput()', globals(), locals()) 
     1 function calls in 40.783 CPU seconds 

    Ordered by: standard name 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     0 0.000    0.000   profile:0(profiler) 
     1 40.783 40.783 40.783 40.783 profile:0(report.generateOutput()) 

正如你所看到的,这不是真正多大用处的。
我需要的是关于所有时间都花在哪里的详细信息,我在这里错过了什么?

+0

是'report.generateOutput()'用C或一个代码*巨型* 2k行没有任何进一步的电话? – delnan 2011-02-24 17:11:53

+2

使用'hotshot'分析器代替 – 2011-02-24 17:14:02

+0

report.generateOutput()仅仅是Python的大约200行,使用cStringIO – 2011-02-24 17:15:37

回答

0

你说的两种不同的东西:

  • “我需要的是其中所有的时间都花在约一些详细信息”

  • “我试图找出为什么某些功能需要很长时间才能完成“

你看,这些并不是一回事。我认为最好问问为什么要比其中,因为其中其实很模糊。

例如,假设存在由大量字符串的气泡排序组成的“瓶颈”。花费的时间在哪里?它是在气泡排序的内部循环中,还是在字符串比较中? Profiler会说后者,但它存在的原因和实际问题在调用堆栈中更高。

Here's an example of how I do it.

+0

你说得对,我希望探查器告诉我在哪里花费的时间,所以我可以找出为什么 – 2011-02-24 19:40:29

+0

@ F.C .:然后我推荐一个探查器,随机抽样堆栈,或者自己做。其实很简单。问题越严重,你会发现它越快。该链接举了一个例子。 – 2011-02-24 20:05:02

2

配置文件report.generateOutput(),而不是函数调用。

要分析以foo()的主入口点的应用程序,你将以下内容添加到您的模块:

import cProfile 
cProfile.run('foo()') 

也许the python docs on profiling是有益的。

+0

我期待一些像文档中的输出,但我不明白为什么我只会得到一个单一的行 – 2011-02-24 18:41:38

+0

按照文档中的描述编辑您想要进行配置文件的功能以包含分析器。分析是逐行完成的,如果你的代码只有一行,那就是你所得到的。 – Patrick 2011-02-24 18:49:43

+0

对不起,我可能会误解一些东西。我只是没有看到文档和我的代码之间有什么区别。他们调用foo()我调用report.generateOutput()。我应该添加一些东西来generateOutput()? – 2011-02-24 19:10:47