1. 程式人生 > 其它 >Python程式碼效能(時間+記憶體)

Python程式碼效能(時間+記憶體)

Python程式碼效能(時間+記憶體)

本文轉載自https://blog.csdn.net/zong596568821xp/article/details/102454288


背景

在運行復雜的Python程式時,執行時間會很長,這時也許想提高程式的執行效率。但該怎麼做呢?首先,要有個工具能夠檢測程式碼中的瓶頸,例如,找到哪一部分執行時間比較長。接著,就針對這一部分進行優化。同時,還需要控制記憶體和CPU的使用,這樣可以在另一方面優化程式碼。本文主要介紹兩種最常用的監控工具。

時間分析

line_profiler模組可以給出執行每行程式碼所需佔用的CPU時間,首先,安裝該模組:

  • pip安裝
$ pip install line_profiler

or

  • 原始碼安裝
$ git clone https://github.com/rkern/line_profiler.git
$ find line_profiler -name '*.pyx' -exec cython {} \;
$ cd line_profiler
$ pip install . --user
  • 示例

import random 
from line_profiler import LineProfiler
from functools import wraps
 
#查詢介面中每行程式碼執行的時間
def func_line_time(f):
    @wraps(f)
    def decorator(*args, **kwargs):
        func_return = f(*args, **kwargs)
        lp = LineProfiler()
        lp_wrap = lp(f)
        lp_wrap(*args, **kwargs) 
        lp.print_stats() 
        return func_return 
    return decorator 
 
@func_line_time
# 定義一個測試函式
def random_sort2(n):
    l = [random.random() for i in range(n)]
    l.sort()
    return l
 
if __name__ == "__main__":
    random_sort2(2000000)

輸出如下所示,各引數含義為

Total Time:測試程式碼的總執行時間
Line:程式碼行號
Hits:表示每行程式碼執行的次數
Time:每行程式碼執行的總時間
Per Hits:每行程式碼執行一次的時間
% Time:每行程式碼執行時間的百分比

網上大多數方法是下邊:

1.在需要測試的函式前新增裝飾器 @profile
2.啟動程式 $kernprof -l -v test.py

這種方法無法正常執行原來的指令碼,如果不用kernprof指令執行指令碼時,還需註釋掉@profile語句,不太方便,因此建議使用這裡推薦的裝飾器的方法。

記憶體分析

memory_profiler模組用來基於逐行測量程式碼的記憶體使用,安裝方法如下:

$ pip install memory_profiler psutil

memory_profiler需要使用@profile裝飾器來標識需要追蹤的函式(即在函式前邊加入@profile),就是上邊一節後邊提到的方法

# 前邊內容省略
 
@profile
# 定義一個測試函式
def random_sort2(n):
    l = [random.random() for i in range(n)]
    l.sort()
    return l
 
# 後邊內容省略

執行

$ python -m memory_profiler test.py

結果

從結果可以看出,記憶體使用是以MiB為單位衡量的,表示的mebibyte(1MiB = 1.05MB)。