檢測Python程序的執(zhí)行效率

檢測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é)果:


image.png

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%的時間。


image.png

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
image.png

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é)果:

image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容