這篇文章將為大家詳細講解有關(guān)Python性能之cProfile和line_profile搭配使用的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
10余年的扎蘭屯網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整扎蘭屯建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)公司從事“扎蘭屯網(wǎng)站設(shè)計”,“扎蘭屯網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
python性能調(diào)試過程中最突出的問題就是耗時,性能測試工具有很多,這里介紹cprofile和line_profiler的搭配使用方法。前者返回項目中每個函數(shù)的耗時,后者可以分析函數(shù)每一行的耗時。
一,cProfile
cProfile是python默認的性能分析器
cProfile是一種確定性分析器,只測量CPU時間,并不關(guān)心內(nèi)存消耗和其他與內(nèi)存相關(guān)聯(lián)的信息。
參數(shù)分析:
run(statement, filename=None, sort=-1) # statement: 需要測試的代碼或者函數(shù)(函數(shù)名) # fielname: 結(jié)果保存的位置, 默認為stdout # sort: 結(jié)果排序方法,常用的有‘cumtime': 累積時間, ’name': 函數(shù)名, ‘line': 行號 # 以及下面結(jié)果分析里的’ncalls'等
使用方法一:
import re
import cProfile
cProfile.run('re.compile("abc")')結(jié)果分析:

第一行:129個函數(shù)調(diào)用被監(jiān)控,其中128個是原生調(diào)用(不涉及遞歸)
ncalls:函數(shù)被調(diào)用的次數(shù)。如果這一列有兩個值,就表示有遞歸調(diào)用,第二個值是原生調(diào)用次數(shù),第一個值是總調(diào)用次數(shù)。
tottime:函數(shù)內(nèi)部消耗的總時間。(可以幫助優(yōu)化)
percall:是tottime除以ncalls,一個函數(shù)每次調(diào)用平均消耗時間。
cumtime:之前所有子函數(shù)消費時間的累計和。
filename:lineno(function):被分析函數(shù)所在文件名、行號、函數(shù)名。
使用方法二:
import cProfile
import re
cProfile.run('re.compile("abc")', 'result.out', 'cumtime')使用方法三:控制臺
終端:python -m cProfile -o result.out -s cumulative test.py # 效果同方法二
結(jié)果分析:
結(jié)果保存在文件名為result.out的二進制文件里。
結(jié)果讀取:pstats模塊和Stats類
import pstats
def view_profile(path):
p = pstats.Stats(f"{path}")
p.sort_stats("cumulative") # 表示結(jié)果按照累計時間耗費排序,其它排序同上
p.print_stats(3) # 輸出結(jié)果 輸出結(jié)果的前三行,參數(shù)還可以是0,1之間的小數(shù),表示輸出結(jié)果的占比,沒有參數(shù)表示輸出全部結(jié)果
p.print_callers() # 可以顯示函數(shù)被哪些函數(shù)調(diào)用
p.print_callees() # 可以顯示哪個函數(shù)調(diào)用了哪些函數(shù)二,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會把分析結(jié)果寫入aaa.py.lprof文件
使用方法二:函數(shù)調(diào)用
from line_profiler import LineProfiler def test_line(func_name, parameter=None): “”“ :param: func_name, str, 函數(shù)名 :param: parameter, 函數(shù)參數(shù) ”“” lp = LineProfiler() lp_wrapper = lp(func_name) if parameter is not None: lp_wrapper(parameter) #如果有參數(shù),沒參數(shù)不用寫 lp.print_stats() # 展示結(jié)果
結(jié)果分析

Line:文件中的行號。
Hits:性能分析時代碼執(zhí)行的次數(shù)。
Time:一段代碼執(zhí)行的總時間,由計數(shù)器決定。
Per Hit:執(zhí)行一段代碼平均消耗時間。
% Time:執(zhí)行一段代碼時間消耗比例。
三,搭配使用
先用cProfile確定項目中耗時最多的幾個函數(shù),然后用line_profiler分析這幾個耗時最多的函數(shù),確定行性能瓶頸。
關(guān)于Python性能之cProfile和line_profile搭配使用的方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
分享名稱:Python性能之cProfile和line_profile搭配使用的方法
URL分享:http://chinadenli.net/article44/jgpoee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、動態(tài)網(wǎng)站、面包屑導(dǎo)航、網(wǎng)站維護、商城網(wǎng)站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)