1. 程式人生 > >Python效能分析指南

Python效能分析指南

使用分析器逐行統計時間和執行頻率

Robert Kern有一個稱作line_profiler的不錯的專案,我經常使用它檢視我的腳步中每行程式碼多快多頻繁的被執行。

想要使用它,你需要通過pip安裝該python包:

$ pip install line_profiler

一旦安裝完成,你將會使用一個稱做“line_profiler”的新模組和一個“kernprof.py”可執行指令碼。

想要使用該工具,首先修改你的原始碼,在想要測量的函式上裝飾@profile裝飾器。不要擔心,你不需要匯入任何模組。kernprof.py指令碼將會在執行的時候將它自動地注入到你的腳步的執行時。

primes.py

@profile
def primes(n): 
    if n==2:
        return [2]
    elif n<2:
        return []
    s=range(3,n+1,2)
    mroot = n ** 0.5
    half=(n+1)/2-1
    i=0
    m=3
    while m <= mroot:
        if s[i]:
            j=(m*m-3)/2
            s[j]=0
            while j<half:
                s[j]=0
j+=m i=i+1 m=2*i+3 return [2]+[x for x in s if x] primes(100)
一旦你已經設定好了@profile裝飾器,使用kernprof.py執行你的腳步。
$ kernprof.py -l -v fib.py
-l選項通知kernprof注入@profile裝飾器到你的腳步的內建函式,-v選項通知kernprof在指令碼執行完畢的時候顯示計時資訊。上述指令碼的輸出看起來像這樣:
Wrote profile results to primes.py.lprof
Timer unit: 1e-06
s File: primes.py Function: primes at line 2 Total time: 0.00019 s Line # Hits Time Per Hit % Time Line Contents ============================================================== 2 @profile 3 def primes(n): 4 1 2 2.0 1.1 if n==2: 5 return [2] 6 1 1 1.0 0.5 elif n<2: 7 return [] 8 1 4 4.0 2.1 s=range(3,n+1,2) 9 1 10 10.0 5.3 mroot = n ** 0.5 10 1 2 2.0 1.1 half=(n+1)/2-1 11 1 1 1.0 0.5 i=0 12 1 1 1.0 0.5 m=3 13 5 7 1.4 3.7 while m <= mroot: 14 4 4 1.0 2.1 if s[i]: 15 3 4 1.3 2.1 j=(m*m-3)/2 16 3 4 1.3 2.1 s[j]=0 17 31 31 1.0 16.3 while j<half: 18 28 28 1.0 14.7 s[j]=0 19 28 29 1.0 15.3 j+=m 20 4 4 1.0 2.1 i=i+1 21 4 4 1.0 2.1 m=2*i+3 22 50 54 1.1 28.4 return [2]+[x for x in s if x]

尋找具有高Hits值或高Time值的行。這些就是可以通過優化帶來最大改善的地方。