Python 效能剖分工具

2021-08-22 14:23:27 字數 1877 閱讀 1345

眼看著專案即將完成,卻被測試人員告知沒有通過效能測試,這種情況在開發中屢見不鮮。接下來的工作就是加班加點地找出效能瓶頸,然後進行優化,再進行效能測試,如此這般周而復始直到通過效能測試。儘管豐富的工作經驗有助於效能優化,但只有科學地應用工具才能在最短的時間內找出最佳優化粒度的瓶頸**段,達到事半功倍的效果。

python 內建了豐富的效能優化工具來幫助我們定位效能瓶頸,如:profile、cprofile和hotshot。它們易於使用,而且有完備的支援文件可供參考。下面以最常用的profile 模組為例來說明它們的使用方法,假定要剖分的指令碼檔案為foo.py ,它的內容如下:

def foo():

sum = 0

for i in range(100):

sum += i

return sum

if __name__ == "__main__":

foo()

對foo.py 進行效能剖分的方法之一是修改foo.py 裡的if 程式塊,引入profile 模組:

if __name__ == "__main__":

import profile

profile.run("foo()")

然後執行foo.py 即可完成效能剖分,剖分結果將以文字報表的形式列印到標準輸出。

因為上述方法需要修改foo.py 檔案,所以我們通常更傾向於使用無需修改原始檔的方法——就是在命令列中用應用python 的–m

引數來執行profile :

python –m profile foo.py

除了可以使用profile 模組外,還可以使用cprofile 模組。cprofile由c 語言實現,是剖分代價更低的剖分器,有和profile 模組相同的介面,但只能用於2.5或以上版本。python 另乙個內建的剖分器是hotshot,但是hotshot 模組已經不再推薦使用,因為將來它可能會被移出標準庫。

無論使用哪個剖分器,它的剖分資料都可以儲存到二進位制檔案,如foo.prof。分析和檢視剖分結果檔案需要使用pstats 模組,它極具伸縮性,可以輸出形式多樣的文字報表,是文字介面下不可或缺的工具。

使用pstats 分析剖分結果很簡單,幾行**就可以了:

import pstats

p = pstats.stats("foo.prof")

p.sort_stats("time").print_stats()

執行上述指令碼將輸出結果為按函式內部執行時間(不計呼叫子函式的時間)長短排序的報表。

sort_stats() 方法是pstats.stats 最重要的方法之一,它用以對剖分資料進行排序。sort_stats() 接受乙個字串引數,這個字串標識了排序的字段,常用的可選的引數及其意義如下:

『ncalls』

被呼叫次數

『cumulative』

函式執行的總時間

『nfl』

name/file/line

『time』

函式內部執行時間(不計呼叫子函式的時間)

除了sort_stats() 外,pstats.stats 還有print_callees() 和print_callers() 方法用以輸出指定函式所呼叫的函式和呼叫過指定函式的函式。

除了編程式設計介面外,pstats 還提供了友好的命令列互動環境,在命令列執行python –m pstats 就可以進入互動環境,在互動環境裡可以使用 read/add 指令讀入/載入剖分結果檔案,stats 指令用以檢視報表,callees 和callers 指令用以檢視特定函式的被呼叫者和呼叫者。下圖是pstats 的截圖,標識了它的基本使用方法:

輸入您的搜尋字詞 提交搜尋表單

webblog.csdn.net

Office Excel拆分工具

解決的問題 其他excel中載入巨集工具,會造成拆分表頭丟失 第一列前幾行有空執行失敗 拆分到本工作簿會把除拆分表以外的其他表刪掉,修改為若為拆分欄位裡的表名則刪掉,否則保留。1 開啟拆分工具表和要拆分的表,啟用要拆分的表視窗 如有彈窗啟用巨集 2 開發工具 巨集 窗體拆分 執行 若無開發工具tab...

python效能監控工具 Python效能監控

profiler是乙個程式,用來描述執行時的程式效能,並且從不同方面提供統計資料加以表述。python中含有3個模組提供這樣的功能,分別是cprofile,profile和pstats。這些分析器提供的是對python程式的確定性分析。同時也提供一系列的報表生成工具,允許使用者快速地檢查分析結果。p...

Centos部分工具命令

啟動 systemctl start httpd 停止 systemctl stop httpd 重啟 systemctl restart httpd 啟動 systemctl start mysqld 停止 systemctl stop mysqld 重啟 systemctl restart my...