本文記錄一些用於 Python 代碼計時和簡單性能分析的工具。強烈推薦後兩種工具。html
Matlab 裏有一對 tic toc
命令,使用格式以下:python
tic % do anything toc
以後會打印中間的代碼執行時間。這種風格對於簡單的計時仍是挺好用的。遺憾的是 Python 中沒有相似的特別方便的模塊,只能用相似於下面的代碼進行模仿:shell
from time import time begin = time() # do anything end = time() print(end - begin)
timeit 模塊用起來特別不方便:segmentfault
from timeit import timeit timeit(stmt='code to run', setup='init code', number=1000000)
後來逐漸發現這個模塊是設計在 Shell 命令行模式下使用的,而不是在 IPython notebook 模式下使用的。所以這裏很少介紹,須要在 Shell 命令行下計時時能夠查閱其 Shell 模式下的使用方法。函數
使用 IPython Notebook 時,最簡單的代碼計時應該是 %%time 魔法命令(magic command, I am a Zhong 2)工具
%%time # code to run...
注意,'%%' 開頭的魔法命令必須寫在一個 cell 的第一行,而且一般以 cell 中剩餘的內容做爲輸入變量。也就是這個魔法命令把 cell 中剩餘的代碼做爲輸入變量,對其進行計時。性能
line_profiler
是一個強大的代碼逐行時間或者空間開銷分析工具,筆者一般用於代碼逐行運行時間分析,從而定位到用時最多的代碼,而且能獲得每行代碼耗時百分比。定位到代碼熱點以後能夠對熱點進行優化,從而以最小的改動而最大程度上提高代碼效率。本文僅介紹筆者經常使用的一種方式。優化
使用前須要安裝:.net
conda install line_profiler # or pip install line_profiler
在 Notebook 中使用,須要運行命令行
%load_ext line_profiler
使用 line_profiler 進行時間分析時,須要指定分析的函數,該工具只會對這個函數中的代碼進行逐行分析。好比對函數 hello
和函數 hi
進行逐行分析,在 Notebook 中命令爲
%lprun -f hello -f hi hello()
-f
參數代表接下來要指定一個函數名進行分析,最後一個參數則是要運行的代碼。該命令會運行最後一個參數指定的代碼,而後在運行時分析全部須要分析的函數。該命令運行以後會打印一個逐行分析報告。
更詳細的使用方法參考 如何進行 Python性能分析,你才能如魚得水?,easy profile python in jupyter 以及這些模塊的幫助文檔和官方文檔。