Python裝飾器實現(xiàn)函數(shù)運行時間的計算
個人理解
裝飾器: 通過閉包和將一個函數(shù)作為另一個函數(shù)參數(shù)的形式,實現(xiàn)已有功能的靈活調用
例如:
首先設置了一個time_master的計時器函數(shù),在運行某個函數(shù)的同時,用來統(tǒng)計函數(shù)的耗時
那么,如果想知道函數(shù)性能, 每次寫完新的函數(shù)后,都放到time_master函數(shù)中運行一次來統(tǒng)計。
——> 這是比較麻煩的。相當于雖然有了一個稱,但是所有的新買食材都需要逐個放到稱上去稱一遍,來獲得食材的重量
——> 如果能夠省略掉一次一次上稱這個步驟就好了
——> 比如每個食材進門的同時就從稱上走過,那進來的同時,也就有了重量的數(shù)據(jù)
例子:調用函數(shù)的同時對函數(shù)進行計時
實現(xiàn)方法1:@語法糖
代碼:
# 涉及到計時,需要引入time模塊
import time
# 定義一個對函數(shù)運行耗時統(tǒng)計的計時器,用func作為形參來代替需要統(tǒng)計的函數(shù)
def time_master(func):
def call_func():
print("計時器開始:函數(shù)開始調用:")
start_time = time.time()
func()
end_time = time.time()
print('計時器結束,函數(shù)調用完成')
return print(f'計時器結果返回:函數(shù)調用耗時{end_time-start_time:.2f}')
return call_func
@time_master
# 即在調用myfunc函數(shù)時,不是直接調用myfunc
# 而是將myfunc函數(shù)作為一個參數(shù)放入到@的裝飾器中,然后去調用裝飾器
def myfunc():
time.sleep(2)
print('myfunc函數(shù)運行')
time.sleep(4)
print('myfunc函數(shù)運行結束')
myfunc() # 調用myfunc
實現(xiàn)結果:
計時器開始:函數(shù)開始調用:
myfunc函數(shù)運行
myfunc函數(shù)運行結束
計時器結束,函數(shù)調用完成
計時器結果返回:函數(shù)調用耗時6.01
實現(xiàn)方法2:閉包
可以理解成,本來定義了一個myfunc的函數(shù),但這個函數(shù)本身沒有計時的功能,而恰巧有一個time_master的函數(shù),在運行子函數(shù)的同時,還會對子函數(shù)進行計時
因此,通過重新定義 myfunc = time_master(myfunc), 即將myfunc作為參數(shù)傳入到time_master中,作為myfunc函數(shù)的新定義
代碼:
import time
def time_master(func):
def call_func():
print("計時器開始:函數(shù)開始調用:")
start_time = time.time()
func()
end_time = time.time()
print('計時器結束,函數(shù)調用完成')
print(f'計時器結果返回:函數(shù)調用耗時{end_time-start_time:.2f}')
return call_func
def myfunc():
time.sleep(2)
print('myfunc函數(shù)運行')
time.sleep(4)
print('myfunc函數(shù)運行結束')
myfunc = time_master(myfunc) # 和實現(xiàn)方法一的差距就在于是在myfunc前面@裝飾器,還是在后面對myfunc函數(shù)進行二次定義
myfunc()
實現(xiàn)結果:
計時器開始:函數(shù)開始調用:
myfunc函數(shù)運行
myfunc函數(shù)運行結束
計時器結束,函數(shù)調用完成
計時器結果返回:函數(shù)調用耗時6.01
實現(xiàn)方式1和 2的差異
實現(xiàn)方式1和實現(xiàn)方式2: 其實沒什么區(qū)別,無非是一開始就用@time_master來規(guī)定,還是定義完myfunc之后,再多做一步讓myfun放入time_master中去執(zhí)行
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
FP-growth算法發(fā)現(xiàn)頻繁項集——發(fā)現(xiàn)頻繁項集
常見的挖掘頻繁項集算法有兩類,一類是Apriori算法,另一類是FP-growth。Apriori通過不斷的構造候選集、篩選候選集挖掘出頻繁項集,需要多次掃描原始數(shù)據(jù),當原始數(shù)據(jù)較大時,磁盤I/O次數(shù)太多,效率比較低下2021-06-06
將python字符串轉化成長表達式的函數(shù)eval實例
這篇文章主要介紹了將python字符串轉化成長表達式的函數(shù)eval實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05

