2011-10-25 71 views
3

我想從對象的角度來剖析python代碼。例如:Python剖析方法

foo = Foo() 
profiled_foo = add_profiling(foo) 

# use profiled_foo like foo 
... 

# later 
profiled_foo.print_profile() 

我想要調用每個方法的每個方法和累積的時間。我沒有發現類似的東西,儘管我認爲寫作不應該太難。

是否有像這樣的庫存在?或者可能不是因爲通過這種方式分析會是一個壞主意?


基於保麥圭爾的回答是:

import inspect 

from time import sleep 
from profilehooks import profile 

class Foo(object): 
    def a(self): 
     sleep(0.1) 

    def b(self): 
     sleep(0.3) 

    def c(self): 
     sleep(0.5) 

def add_profiling(obj): 
    for k in dir(obj): 
     attr = getattr(obj, k) 
     if inspect.ismethod(attr) and k != '__init__': 
      setattr(obj, k, profile(attr)) 

if __name__ == '__main__': 
    foo = Foo() 
    add_profiling(foo) 

    foo.a() 
    foo.a() 
    foo.b() 
    foo.b() 
    foo.a() 
    foo.c() 

*** PROFILER RESULTS *** 
c (oprof.py:13) 
function called 1 times 

     3 function calls in 0.501 CPU seconds 

    Ordered by: cumulative time, internal time, call count 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.000 0.000 0.501 0.501 oprof.py:13(c) 
     1 0.501 0.501 0.501 0.501 {time.sleep} 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 
     0 0.000    0.000   profile:0(profiler) 

... 

回答

1

你可以看一下http://docs.python.org/library/profile.html

我個人認爲CPROFILE是蟒蛇更直觀和快捷的分析工具。

要分析單個類,您可以編寫簡單的測試腳本並使用cProfile運行它們。

1

你可能已經聽說過這一點,但快有一個區別分析之間爲了自身的利益,而使用使代碼運行的客觀剖析爲可能。

這很好,您希望每個方法的累計時間總計超過對該方法的所有調用,因爲如果將該方法除以總執行時間,則可以獲得方法負責的時間百分比。 如果有人可以修復以獲得更好的速度,那麼它就是自己代碼中的高百分比方法。

比獲得高累積百分比的方法更好的方法是獲得高累積百分比的代碼行。 這是因爲如果您想查看問題出現的方法,您正在尋找具有高百分比的特定代碼行。 因此,如果您的分析器告訴您這些行在哪裏,您已經擁有(取決於方法大小),可能在定位問題時的精度更高一個數量級。

即使知道你的代碼中具有高百分比的行的位置,也知道它們可能被執行的上下文。

有些人認爲有必要做的一件事是獲得準確的時間測量。然而,一旦你在你的代碼中找到一條明確表示獲得良好加速的機會,因爲刪除 - 替換 - 以不同的方式執行它會節省大量的總體時間,如果你對該百分比的估計是關閉的,真的很重要一點點? 假設您找到該行,並認爲它的成本爲50%。 如果修復它的實際節約成本只有30%或70%,那麼你是否花時間修復它會感覺不好?

這就是爲什麼我鼓勵堆棧採樣,爲此this is a small example

堆棧樣本自動爲您提供行級百分比,因爲一行的百分比成本只是包含它的樣本的百分比。 它們自動包含阻塞時間,例如I/O,這是您需要知道的,因爲它會影響整體時間。 如果採集100個或1000個樣本,您可以獲得高精度的測量結果,但一些非常簡單的統計數據證明,除了最小的問題外,少量樣本足以精確定位問題。 最後,告知線條是否被良好使用的上下文位於樣本中。 許多探查者將樣本拼湊在一起以獲取數字,但不要讓用戶看到具有代表性的樣本。因此,他們傾向於假定「熱」的代碼行是必要的,但實際上上下文可以告訴他們它不是。

這是more extensive listing of the issues