2011-02-24 52 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

相關問題