Python效能分析指南
阿新 • • 發佈:2019-02-03
使用分析器逐行統計時間和執行頻率
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值的行。這些就是可以通過優化帶來最大改善的地方。