使用Python統(tǒng)計(jì)函數(shù)執(zhí)行時(shí)間的裝飾器
裝飾器的使用場(chǎng)景:
為函數(shù)新增功能,解決重復(fù)性的操作,使得代碼簡(jiǎn)潔,更模塊兒化
裝飾器本質(zhì)上是一個(gè)Python函數(shù),
它可以在不改變?cè)己瘮?shù)的情況下,添加一些額外的功能,例如日志記錄、緩存結(jié)果,以及計(jì)算函數(shù)的運(yùn)行時(shí)間。
接收另一個(gè)函數(shù)作為參數(shù),并返回一個(gè)新函數(shù)。
在Python中,可以使用@符號(hào)放置在要被裝飾的函數(shù)前面,將一個(gè)裝飾器應(yīng)用到一個(gè)函數(shù)上。
以下是一個(gè)簡(jiǎn)單的計(jì)時(shí)裝飾器的例子:
import time?
def
calculate_time
(func):
? ?
? ?def wrapper(*args, **kwargs):
? ? ? ?
? ? ? start = time.time()
? ? ? ?
? ? ? result = func(*args, **kwargs)
? ? ? ?
? ? ? end = time.time()?
? ? ? cost_time =?end - start??
? ? ??print(“花費(fèi)時(shí)間:{}秒”.format(cost_time)")??
?? ? ??
? ? ? return result
? ?
? ? return wrapper?
calculate_time()是一個(gè)裝飾器函數(shù),它接受一個(gè)函數(shù)作為輸入?yún)?shù),并且返回一個(gè)新的函數(shù)wrapper。
wrapper()可以接收任何數(shù)量和類型的輸入?yún)?shù),并在執(zhí)行原始函數(shù)之前記錄起始時(shí)間。然后執(zhí)行原始函數(shù),獲取函數(shù)的結(jié)果;最后記錄結(jié)束時(shí)間,并計(jì)算函數(shù)的運(yùn)行時(shí)間。運(yùn)行時(shí)間輸出到控制臺(tái),然后返回原始函數(shù)的結(jié)果。
裝飾器最終會(huì)返回新的函數(shù)wrapper,因此它將替換原始函數(shù)。
使用“@calculate_time”將裝飾器應(yīng)用于需要計(jì)算運(yùn)行時(shí)間的函數(shù)。
@calculate_time?
def myfunc():
? ?
? ?time.sleep(1)
? ?
? ?print("Function executed")?
myfunc()