Python程式碼效能(時間+記憶體)
阿新 • • 發佈:2021-08-04
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)。