您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python性能之cProfile和line_profile搭配使用的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
python性能調試過程中最突出的問題就是耗時,性能測試工具有很多,這里介紹cprofile和line_profiler的搭配使用方法。前者返回項目中每個函數的耗時,后者可以分析函數每一行的耗時。
一,cProfile
cProfile是python默認的性能分析器
cProfile是一種確定性分析器,只測量CPU時間,并不關心內存消耗和其他與內存相關聯的信息。
參數分析:
run(statement, filename=None, sort=-1) # statement: 需要測試的代碼或者函數(函數名) # fielname: 結果保存的位置, 默認為stdout # sort: 結果排序方法,常用的有‘cumtime': 累積時間, ’name': 函數名, ‘line': 行號 # 以及下面結果分析里的’ncalls'等
使用方法一:
import re import cProfile cProfile.run('re.compile("abc")')
結果分析:
第一行:129個函數調用被監控,其中128個是原生調用(不涉及遞歸)
ncalls:函數被調用的次數。如果這一列有兩個值,就表示有遞歸調用,第二個值是原生調用次數,第一個值是總調用次數。
tottime:函數內部消耗的總時間。(可以幫助優化)
percall:是tottime除以ncalls,一個函數每次調用平均消耗時間。
cumtime:之前所有子函數消費時間的累計和。
filename:lineno(function):被分析函數所在文件名、行號、函數名。
使用方法二:
import cProfile import re cProfile.run('re.compile("abc")', 'result.out', 'cumtime')
使用方法三:控制臺
終端:python -m cProfile -o result.out -s cumulative test.py # 效果同方法二
結果分析:
結果保存在文件名為result.out的二進制文件里。
結果讀取:pstats模塊和Stats類
import pstats def view_profile(path): p = pstats.Stats(f"{path}") p.sort_stats("cumulative") # 表示結果按照累計時間耗費排序,其它排序同上 p.print_stats(3) # 輸出結果 輸出結果的前三行,參數還可以是0,1之間的小數,表示輸出結果的占比,沒有參數表示輸出全部結果 p.print_callers() # 可以顯示函數被哪些函數調用 p.print_callees() # 可以顯示哪個函數調用了哪些函數
二,line_profiler
這個性能分析器和cProfile不同,他能幫你一行一行的分析性能。
如果瓶頸問題在某一行中,這樣就需要line_profiler解決了。
建議使用kernprof工具
安裝
pip install line_profiler
使用方法一:kernprof
@profile def fib(n): # 文件名aaa.py a, b = 0, 1 for i in range(0, n): a, b = b, a+b return a fib(5)
終端:kernprof -l -v aaa.py # -l表示逐行分析 -v用于控制臺輸出, 不加-v會把分析結果寫入aaa.py.lprof文件
使用方法二:函數調用
from line_profiler import LineProfiler def test_line(func_name, parameter=None): “”“ :param: func_name, str, 函數名 :param: parameter, 函數參數 ”“” lp = LineProfiler() lp_wrapper = lp(func_name) if parameter is not None: lp_wrapper(parameter) #如果有參數,沒參數不用寫 lp.print_stats() # 展示結果
結果分析
Line:文件中的行號。
Hits:性能分析時代碼執行的次數。
Time:一段代碼執行的總時間,由計數器決定。
Per Hit:執行一段代碼平均消耗時間。
% Time:執行一段代碼時間消耗比例。
三,搭配使用
先用cProfile確定項目中耗時最多的幾個函數,然后用line_profiler分析這幾個耗時最多的函數,確定行性能瓶頸。
關于Python性能之cProfile和line_profile搭配使用的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。