cProfile 模塊是自 python 2.5 以來標準版 Python 解釋器的默認性能分析器。它是一種確定性分析器,只測量 CPU 時間,並不包含內存消耗和其他與內存相關聯的信息。
代碼分析模板如下:
import cProfile, pstats, io
from pstats import SortKey
pr = cProfile.Profile()
pr.enable()
# ... do something ...
pr.disable()
s = io.StringIO()
sortby = SortKey.CUMULATIVE
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print(s.getvalue())
我們在 do something 所在行內,編寫需要性能測試的代碼。
輸出結果形如:
具體步驟如下:
- 首先導入相關模塊。
- 初建 Profile 對象。
- 初建 IO 對象,用於存儲分析結果。
- 設定分析結果排序字段。
- 開始分析。
- 打印分析結果。
統計結果字段說明如下:
字段 | 說明 |
---|---|
ncalls | 調用次數。 |
tottime | 在指定函數中消耗的總時間(不包括調用子函數的時間)。 |
percall | tottime 除以 ncalls 的商,即平均時間。 |
filename:lineno(function) | 詳情說明,即調用函數所在文件名:行號(函數名)。 |
用到了 cProfile 對象中的這些方法:
方法 | 說明 |
---|---|
enable() | 開始收集分析數據。 |
disable() | 停止收集分析數據。 |
print_stats(sort=-1) | 打印分析結果到輸出流,默認爲隨機排序序列。 |
如果第一列中有兩個數字(例如3/1),則表示函數遞歸。第二個值是原始調用次數,第一個是調用的總次數。注意,當函數不遞歸時,這兩個值是相同的,並且只打印單個數字。
pstats.Stats 是個類,定義爲:
pstats.Stats(*filenames or profile, stream=sys.stdout)
用於創建統計對象,接受兩個入參,代碼示例中爲 profile 和輸出流。
pstats.Stats 有一個 sort_stats(*keys) 方法,用於排序統計結果,支持以下排序參數:
排序參數 | 有效枚舉參數 | 含義 |
---|---|---|
‘calls’ | SortKey.CALLS | 調用次數 |
‘cumulative’ | SortKey.CUMULATIVE | 累積時間 |
‘cumtime’ | N/A | 累積時間 |
‘file’ | N/A | 文件名 |
‘filename’ | SortKey.FILENAME | 文件名 |
‘module’ | N/A | 文件名 |
‘ncalls’ | N/A | 調用次數 |
‘pcalls’ | SortKey.PCALLS | 原始調用計數 |
‘line’ | SortKey.LINE | 行號 |
‘name’ | SortKey.NAME | 函數名稱 |
‘nfl’ | SortKey.NFL | 名稱/文件/行 |
‘stdname’ | SortKey.STDNAME | 標準名稱 |
‘time’ | SortKey.TIME | 內部時間 |
‘tottime’ | N/A | 內部時間 |