when use profiler?
有時候你覺得程式執行很慢,想對程式進行優化,但是你又不知道哪部分程式入手,這時候你就需要對程式整體效能進行分析,看看速度慢主要是哪部分程式導致的
why use cprofile?
cprofile,乙個python程式效能分析模組。其實python有兩個profiler,profile和cprofile,前者是純python寫的,會產生比較大的開銷,測試結果不準確。後者是c語言擴充套件模組,對受測程式影響比較小,所以推薦用cprofile.
how to use cprofile?
首先有以下程式:
from cprofile import profile
from pstats import stats
deffor1()
: y =
0for i in
range
(100):
y = y +i
deffor2()
: y =
0for i in
range
(1000000):
y = y + i
deftest()
:
for1(
) for2(
)
現在要對test進行分析:
if __name__ ==
"__main__"
: profiler = profile(
)#建立profiler物件
profiler.runcall(test)
#對test進行測試
stats = stats(profiler)
stats.strip_dirs(
) stats.sort_stats(
'cumulative'
) stats.print_stats(
)
結果如下:
4 function calls in
0.192 seconds
ordered by: cumulative time
ncalls tottime percall cumtime percall filename:lineno(function)
10.000
0.000
0.192
0.192 main.py:
48(test1)
10.192
0.192
0.192
0.192 main.py:
43(for2)
10.000
0.000
0.000
0.000 main.py:
38(for1)
10.000
0.000
0.000
0.000
要分析該結果,我們先要知道幾個名詞的意思(從左到右)
ncalls:函式在效能分析期間呼叫的次數
tottime:函式總的執行時間,除去子函式的執行時間
percall:tottime/ncalls
cumtime:該函式包括子函式的累計時間
percall:cumtime/ncalls
filename:lineno(function):函式呼叫的資訊
ok,到這裡,你就可以看出來for2函式執行時間是最長的了,因為它cumtime比for1的大。
我們還使用了pstats的stats類:
stats = stats(profiler):建立物件
stats.strip_dirs():去掉無關路徑資訊
stats.sort_stats(『cumulative』):按累計時間進行排序,也可以按照calls, cumulative,line, module, name, nfl, pcalls, stdname, time進行排序
stats.print_stats():列印統計訊息,如果想列印top2的資訊,則 stats.print_stats(2)
python程式效能分析
目錄 python m cprofile o output file s sort order m module myscript.py o將結果輸出到檔案而不是stdout s排序狀態,選擇那些引數排序,常用 tottime m作為乙個模組而不是指令碼,python3.7的cprofile中有,p...
Python內建型別程式效能分析
timeit模組可以用來測試一小段python 的執行速度。class timeit.timer stmt pass setup pass timer timer是測量小段 執行速度的類。stmt引數是要測試的 語句 statment setup引數是執行 時需要的設定 timer引數是乙個定時器函...
golang程式效能分析
vegeta是乙個用go語言編寫的多功能的http負載測試工具,提供命令列工具和開發包。安裝見vegeta 說明。usage vegeta global flags command flags global flags cpus int 使用cup的數量 預設4 個 profile string e...