使用cProfile分析Python程式效能

2021-08-15 10:42:51 字數 2935 閱讀 1949

cprofile:基於lsprof的用c語言實現的擴充套件應用,執行開銷比較合理,適合分析執行時間較長的程式,推薦使用這個模組; 

profile:純python實現的效能分析模組,介面和cprofile一致。但在分析程式時增加了很大的執行開銷。不過,如果你想擴充套件profiler的功能,可以通過繼承這個模組實現; 

使用cprofile進行效能分析,你可以在python指令碼中實現,也可以使用命令列執行:

import cprofile

# 直接把分析結果列印到控制台

cprofile.run("test()")

# 把分析結果儲存到檔案中

cprofile.run("test()", filename="result.out")

# 增加排序方式

cprofile.run("test()", filename="result.out", sort="cumulative")

使用命令列執行的方法基本一致,bash**如下:

# 直接把分析結果列印到控制台

python -m cprofile test.py

# 把分析結果儲存到檔案中

python -m cprofile -o result.out test.py

# 增加排序方式

python -m cprofile -o result.out -s cumulative test.py

使用cprofile分析的結果可以輸出到指定的檔案中,但是檔案內容是以二進位制的方式儲存的,用文字編輯器開啟時亂碼。所以,python提供了乙個pstats模組,用來分析cprofile輸出的檔案內容。

import pstats

# 建立stats物件

p = pstats.stats("result.out")

# strip_dirs(): 去掉無關的路徑資訊

# sort_stats(): 排序,支援的方式和上述的一致

# print_stats(): 列印分析結果,可以指定列印前幾行

# 和直接執行cprofile.run("test()")的結果是一樣的

p.strip_dirs().sort_stats(-1).print_stats()

# 按照函式名排序,只列印前3行函式的資訊, 引數還可為小數,表示前百分之幾的函式資訊

p.strip_dirs().sort_stats("name").print_stats(3)

# 按照執行時間和函式名進行排序

p.strip_dirs().sort_stats("cumulative", "name").print_stats(0.5)

# 如果想知道有哪些函式呼叫了sum_num

p.print_callers(0.5, "sum_num")

# 檢視test()函式中呼叫了哪些函式

p.print_callees("test")

結果類似:

8

function calls in 0.042 seconds

ordered by: cumulative time

ncalls

tottime percall cumtime percall filename:lineno(function)

10.000

0.000

0.042

0.042

test.py:5

()10.002

0.002

0.042

0.042

test.py:12

(test)

20.035

0.018

0.039

0.020

test.py:5

(sum_num)

30.004

0.001

0.004

0.001

10.000

0.000

0.000

0.000

其中,輸出每列的具體解釋如下:

ncalls:表示函式呼叫的次數;

tottime:表示指定函式的總的執行時間,除掉函式中呼叫子函式的執行時間;

percall:(第乙個percall)等於 tottime/ncalls;

cumtime:表示該函式及其所有子函式的呼叫執行的時間,即函式開始呼叫到返回的時間;

percall:(第二個percall)即函式執行一次的平均時間,等於 cumtime/ncalls;

filename:lineno(function):每個函式呼叫的具體資訊;

另外,上面分析的時候,排序方式使用的是函式呼叫時間(cumulative),除了這個還有一些其他允許的排序方式:calls, cumulative, file, line, module, name, nfl, pcalls, stdname, time等。

對於一些比較大的應用程式,如果能夠將效能分析的結果以圖形的方式呈現,將會非常實用和直觀,常見的視覺化工具有gprof2dot,visualpytune,kcachegrind等,這裡介紹一下gprof2dot的用法。 

使用之前,你需要安裝graphviz:

sudo apt-get install graphviz
python gprof2dot.py -f pstats result.out | dot -tpng -o result.png
結果如下: 

參考文獻:

python 效能分析入門指南

檢測python程式執行效率及記憶體和cpu使用的7種方法

python **效能優化技巧

關於python profilers效能分析器

the python profilers

高效程式設計之 cProfile 效能分析

寫 經常會聽說一些名詞,比如 效能分析 調優。cprofile 是 python 調優的一種工具,它能夠統計在整個 執行過程中,每個函式呼叫的次數和消耗的時間。這個工具雖然很常用,但是沒必要花太多時間研究這個工具,簡單使用就能達到效果,所以我這裡只簡單記錄下核心用法。兩種使用方式 cprofile....

python金融分析 用於金融分析的Python包

recommended by activestate.1.numpy 實現各種陣列物件函式和傅利葉變換等等科學計算模組。3.matplotlib 乙個跨平台的數值繪圖包,可繪製高質量的2d,3d影象。4.mysql for python python操作mysql資料庫的介面軟體包。5.pyqt 乙...

使用virtualenv建立獨立的Python環境

virtualenv是 python的沙盒環境,主要解決以下問題 yum groupinstall development tools yum y install zlib devel bzip2 devel openssl devel ncurses devel sqlite devel read...