今天剛看到ipython的一個(gè)函數(shù)執(zhí)行時(shí)間的分析器蜈漓,非常好用穆桂,記錄一下。
安裝模塊
pip install line_profiler
導(dǎo)入模塊
%load_ext line_profiler
例子
先定義一個(gè)函數(shù):
def sum_of_lists(n):
total =0
for i in range(5):
l = [j ^ (j >> i) for j in range(n)]
total += sum(l)
return tatal
使用line_profiler分析函數(shù)執(zhí)行時(shí)間
%lprun -f sum_of_lists sum_of_lists(5000)
Timer unit: 2.84444e-07 s
Total time: 0.00461681 s
File: <ipython-input-40-ce32f0c125bd>
Function: sum_of_lists at line 1
Line # Hits Time Per Hit % Time Line Contents
==============================================================
1 def sum_of_lists(n):
2 1 5.0 5.0 0.0 total =0
3 6 11.0 1.8 0.1 for i in range(5):
4 5 15685.0 3137.0 96.6 l = [j ^ (j>>i) for j in range(n) ]
5 5 529.0 105.8 3.3 total += sum(l)
6 1 1.0 1.0 0.0 return total
ok,很明顯發(fā)現(xiàn)絕大部分的時(shí)間都發(fā)在第4行代碼 l = [j ^ (j>>i) for j in range(n) ] 上了融虽。
pycharm中自帶了性能分析工具
測(cè)試函數(shù)如下:
在run菜單下選擇 profile your_file_name
執(zhí)行后會(huì)生成測(cè)試結(jié)果享完。
Statistcs(性能統(tǒng)計(jì))和Call Graph(調(diào)用關(guān)系圖)
Statistcs
表頭Name顯示被調(diào)用的模塊或者函數(shù);Call Count顯示被調(diào)用的次數(shù)有额;Time(ms)顯示運(yùn)行時(shí)間和時(shí)間百分比般又,時(shí)間單位為毫秒(ms)。
點(diǎn)擊表頭上的小三角可以升序或降序排列表格巍佑。
在Name這一個(gè)列中雙擊某一行可以跳轉(zhuǎn)到對(duì)應(yīng)的代碼茴迁。
Call Graph
右上角的4個(gè)按鈕表示放大、縮小萤衰、真實(shí)大小堕义、合適大小脆栋;
箭頭表示調(diào)用關(guān)系倦卖,由調(diào)用者指向被調(diào)用者;
矩形的左上角顯示模塊或者函數(shù)的名稱椿争,右上角顯示被調(diào)用的次數(shù)怕膛;
矩形中間顯示運(yùn)行時(shí)間和時(shí)間百分比;
-
矩形的顏色表示運(yùn)行時(shí)間或者時(shí)間百分比大小的趨勢(shì):紅色 > 黃綠色 > 綠色