思路
python使用修飾器記錄方法耗時,目的是每當方法執行完后,可以記錄該方法耗時,而不需要在每個方法的執行前后,去創建一個臨時變量,來記錄耗時。
方式一(不推薦):
在每個方法的執行前后,去創建一個臨時變量,來記錄耗時,代碼如下,缺點在于,如果有10個、100個方法,那不得寫10次、100次?且這樣去寫,容易寫漏,而且過于冗余
def fun():# 開始計時start_time = time.time()# 模擬耗時time.sleep(2)# 停止計時end_time = time.time()print("fun01執行嘍")
方式二(推薦):
使用裝飾器來記錄耗時,好處在于,將其標注在需要記錄的方法前,這樣的做法,相當于將這個方法,傳遞給另一個方法中。讓方法A去執行方法B(俗稱:套娃)。
這樣的好處在于,我們只需要做標注,不用去改動到需要記錄耗時的方法中的內容,這樣可以減少出錯和冗余,代碼如下:
import time
# 使用裝飾器,記錄方法執行耗時
def timer(method_name):def decorator(func):def wrapper(*args, **kwargs):# 開始計時start_time = time.time()# 執行方法result = func(*args, **kwargs)# 停止計時end_time = time.time()# 統計耗時并輸出execution_time = end_time - start_timelog = "{} 執行耗時: {:.2f} 秒".format(method_name, execution_time)print(log)return resultreturn wrapperreturn decorator# 方法1 使用裝飾器標注
@timer("fun01()")
def fun01():# 模擬耗時time.sleep(2)print("fun01執行嘍")# 方法2 不使用任何標注
def fun02():# 模擬耗時time.sleep(1)print("fun02執行嘍")# 方法3 使用裝飾器標注
@timer("fun03()")
def fun03():# 模擬耗時time.sleep(3)print("fun03執行嘍")# 順序執行fun01、02和03
fun01()
fun02()
fun03()
代碼直接執行,可以看到如下的輸出:
1.輸出fun01()“執行嘍”,卻輸出耗時是2.01秒,因為這里sleep了2秒,且使用了裝飾器。
2.輸出fun02()“執行嘍”,但未記錄執行耗時,原因是這里并未使用“裝飾器”記錄方法的耗時。
3.輸出fun03()“執行嘍”,卻輸出耗時是3.00秒,因為這里sleep了3秒,且使用了裝飾器。
整理不易!
點贊!關注唄!