檢測Python程序的執(zhí)行效率的幾種方法
1.在函數(shù)上加裝飾器,來得到函數(shù)的執(zhí)行時間。
def wrapper(*args, **kwargs):
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
timestrap = end -start
print('function %s running time is %s'%(func.__name__,timestrap))
return ret
return wrapper
2.用timeit模塊來計算代碼執(zhí)行時間:
python3 -m timeit -n 4 -r 5 -s "import binaryTree" "binaryTree" #其中binaryTree表示python腳本文件名
或
python3 -m timeit -n 4 -r 5 -s "import binaryTree" "binaryTree.functionname" #可以指定腳本中某個具體的函數(shù)
參數(shù):
-m mod : run library module as a script (terminates option list)
執(zhí)行結(jié)果:
4 loops, best of 5: 0.0792 usec per loop
這表示測試了4次,平均每次測試重復(fù)5次,最好的測試結(jié)果是0.0792秒。
如果不指定測試或重復(fù)次數(shù),默認(rèn)值為10次測試,每次重復(fù)5次。
3.Linux的time命令
time -p python3 multiTree.py
執(zhí)行結(jié)果:
real 0.09 # 執(zhí)行腳本的總時間
user 0.04 # 執(zhí)行腳本消耗的CPU時間
sys 0.00 # 執(zhí)行內(nèi)核函數(shù)消耗的時間
# real - (user + sys)的時間差,就是消耗在I/O等待和執(zhí)行其他任務(wù)消耗的時間。
4.如果想知道每個函數(shù)消耗的多少時間,以及每個函數(shù)執(zhí)行了多少次,可以用CProfile模塊。
python3 -m cProfile -s cumulative multiTree.py
執(zhí)行結(jié)果:

5.使用line_Profiler可以給出執(zhí)行每行代碼所占用的CPU時間。
$ sudo pip3 install line_Profiler
用@profile 指定去檢測那個函數(shù),不需要導(dǎo)入模塊。
@profile
def random_sort2(n):
l = [random.random() for i in range(n)]
l.sort()
return l
if __name__ == "__main__":
random_sort2(2000000)
可以通過如下命令逐行掃描每行代碼的執(zhí)行情況:
$ kernprof -l -v timing_functions.py
其中-l表示逐行解釋,-v表示表示輸出詳細(xì)結(jié)果。通過這種方法,我們看到構(gòu)建數(shù)組消耗了44%的計算時間,而sort()方法消耗了剩余的56%的時間。

6.memory_profiler模塊
逐行檢測每行代碼內(nèi)存的使用的情況。但使用這個模塊會讓代碼運行更慢。
$ sudo pip3 install memory_profiler
安裝 psutil模塊,會讓memory_profiler運行更快。
$ sudo pip3 install psutil
在函數(shù)上加 @profile 裝飾器來指定需要追蹤的函數(shù)。
執(zhí)行如下命令,查看結(jié)果:
$ python3 -m memory_profiler timing_functions.py

7.guppy模塊
通過這個包可以知道在代碼執(zhí)行的每個階段中,每種類型(str、tuple、dict等)分別創(chuàng)建了多少對象。
$ pip3 install guppy
將其添加到代碼中:
from guppy import hpy
def random_sort3(n):
hp = hpy()
print( "Heap at the beginning of the functionn", hp.heap())
l = [random.random() for i in range(n)]
l.sort()
print( "Heap at the end of the functionn", hp.heap())
return l
if __name__ == "__main__":
random_sort3(2000000)
執(zhí)行命令:
$ python3 timing_functions.py
查看結(jié)果:

非常好的模式,讓我今年收益翻倍的文章,強烈推薦分享下:
2020年4月至6月凈利潤斷層實戰(zhàn)小結(jié)-真香~