說說如何使用 Python 的 cProfile 模塊分析代碼性能

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 所在行內,編寫需要性能測試的代碼。

輸出結果形如:

具體步驟如下:

  1. 首先導入相關模塊。
  2. 初建 Profile 對象。
  3. 初建 IO 對象,用於存儲分析結果。
  4. 設定分析結果排序字段。
  5. 開始分析。
  6. 打印分析結果。

統計結果字段說明如下:

字段 說明
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 內部時間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章