Python 效能分析工具簡介

發表於2016-11-21

效能分析和調優工具簡介

總會遇到一個時候你會想提高程式執行效率,想看看哪部分耗時長成為瓶頸,想知道程式執行時記憶體和CPU使用情況。這時候你會需要一些方法對程式進行效能分析和調優。

By Context Manager

可以上下文管理器自己實現一個計時器, 參見之前的介紹 timeit 文章裡做的那樣,通過定義類的 __enter____exit__ 方法來實現對管理的函式計時, 類似如:

使用方式如下:

By Decorator

然而我認為裝飾器的方式更加優雅

使用就很簡單了:

執行結果:

系統自帶的time命令

使用示例如下:

上面的結果說明: 執行指令碼消耗0.79sCPU時間, 0.18秒執行核心函式消耗的時間,總共0.977s時間。
其中, total時間 - (user時間 + system時間) = 消耗在輸入輸出和系統執行其它任務消耗的時間

python timeit 模組

可以用來做benchmark, 可以方便的重複一個程式執行的次數,來檢視程式可以執行多塊。具體參考之前寫的文章

cProfile

直接看帶註釋的使用示例吧。

cProfile將分析的結果儲存到result.out檔案中,但是以二進位制形式儲存的,想直接檢視的話用提供的 pstats 來檢視。

擷取一個檢視test()呼叫了哪些函式的輸出示例:

profile.Profile

cProfile還提供了可以自定義的類,可以更精細的分析, 具體看文件
格式如: class profile.Profile(timer=None, timeunit=0.0, subcalls=True, builtins=True)
下面這個例子來自官方文件:

lineprofiler

lineprofiler是一個對函式進行逐行效能分析的工具,可以參見github專案說明,地址: https://github.com/rkern/line…

示例

通過 kernprof 命令來注入分析,執行結果如下:

hits(執行次數) 和 time(耗時) 值高的地方是有比較大優化空間的地方。

memoryprofiler

類似於”lineprofiler“對基於行分析程式記憶體使用情況的模組。github 地址:https://github.com/fabianp/me… 。ps:安裝 psutil, 會分析的更快。

同樣是上面”lineprofiler“中的程式碼,執行 python -m memory_profiler profile.py 命令生成結果如下:

TODO objgraph

參考資料:

相關文章