Python裝飾器實(shí)現(xiàn)函數(shù)運(yùn)行時(shí)間的計(jì)算
個(gè)人理解
裝飾器: 通過閉包和將一個(gè)函數(shù)作為另一個(gè)函數(shù)參數(shù)的形式,實(shí)現(xiàn)已有功能的靈活調(diào)用
例如:
首先設(shè)置了一個(gè)time_master的計(jì)時(shí)器函數(shù),在運(yùn)行某個(gè)函數(shù)的同時(shí),用來統(tǒng)計(jì)函數(shù)的耗時(shí)
那么,如果想知道函數(shù)性能, 每次寫完新的函數(shù)后,都放到time_master函數(shù)中運(yùn)行一次來統(tǒng)計(jì)。
——> 這是比較麻煩的。相當(dāng)于雖然有了一個(gè)稱,但是所有的新買食材都需要逐個(gè)放到稱上去稱一遍,來獲得食材的重量
——> 如果能夠省略掉一次一次上稱這個(gè)步驟就好了
——> 比如每個(gè)食材進(jìn)門的同時(shí)就從稱上走過,那進(jìn)來的同時(shí),也就有了重量的數(shù)據(jù)
例子:調(diào)用函數(shù)的同時(shí)對(duì)函數(shù)進(jìn)行計(jì)時(shí)
實(shí)現(xiàn)方法1:@語(yǔ)法糖
代碼:
# 涉及到計(jì)時(shí),需要引入time模塊
import time
# 定義一個(gè)對(duì)函數(shù)運(yùn)行耗時(shí)統(tǒng)計(jì)的計(jì)時(shí)器,用func作為形參來代替需要統(tǒng)計(jì)的函數(shù)
def time_master(func):
def call_func():
print("計(jì)時(shí)器開始:函數(shù)開始調(diào)用:")
start_time = time.time()
func()
end_time = time.time()
print('計(jì)時(shí)器結(jié)束,函數(shù)調(diào)用完成')
return print(f'計(jì)時(shí)器結(jié)果返回:函數(shù)調(diào)用耗時(shí){end_time-start_time:.2f}')
return call_func
@time_master
# 即在調(diào)用myfunc函數(shù)時(shí),不是直接調(diào)用myfunc
# 而是將myfunc函數(shù)作為一個(gè)參數(shù)放入到@的裝飾器中,然后去調(diào)用裝飾器
def myfunc():
time.sleep(2)
print('myfunc函數(shù)運(yùn)行')
time.sleep(4)
print('myfunc函數(shù)運(yùn)行結(jié)束')
myfunc() # 調(diào)用myfunc
實(shí)現(xiàn)結(jié)果:
計(jì)時(shí)器開始:函數(shù)開始調(diào)用:
myfunc函數(shù)運(yùn)行
myfunc函數(shù)運(yùn)行結(jié)束
計(jì)時(shí)器結(jié)束,函數(shù)調(diào)用完成
計(jì)時(shí)器結(jié)果返回:函數(shù)調(diào)用耗時(shí)6.01
實(shí)現(xiàn)方法2:閉包
可以理解成,本來定義了一個(gè)myfunc的函數(shù),但這個(gè)函數(shù)本身沒有計(jì)時(shí)的功能,而恰巧有一個(gè)time_master的函數(shù),在運(yùn)行子函數(shù)的同時(shí),還會(huì)對(duì)子函數(shù)進(jìn)行計(jì)時(shí)
因此,通過重新定義 myfunc = time_master(myfunc), 即將myfunc作為參數(shù)傳入到time_master中,作為myfunc函數(shù)的新定義
代碼:
import time
def time_master(func):
def call_func():
print("計(jì)時(shí)器開始:函數(shù)開始調(diào)用:")
start_time = time.time()
func()
end_time = time.time()
print('計(jì)時(shí)器結(jié)束,函數(shù)調(diào)用完成')
print(f'計(jì)時(shí)器結(jié)果返回:函數(shù)調(diào)用耗時(shí){end_time-start_time:.2f}')
return call_func
def myfunc():
time.sleep(2)
print('myfunc函數(shù)運(yùn)行')
time.sleep(4)
print('myfunc函數(shù)運(yùn)行結(jié)束')
myfunc = time_master(myfunc) # 和實(shí)現(xiàn)方法一的差距就在于是在myfunc前面@裝飾器,還是在后面對(duì)myfunc函數(shù)進(jìn)行二次定義
myfunc()
實(shí)現(xiàn)結(jié)果:
計(jì)時(shí)器開始:函數(shù)開始調(diào)用:
myfunc函數(shù)運(yùn)行
myfunc函數(shù)運(yùn)行結(jié)束
計(jì)時(shí)器結(jié)束,函數(shù)調(diào)用完成
計(jì)時(shí)器結(jié)果返回:函數(shù)調(diào)用耗時(shí)6.01
實(shí)現(xiàn)方式1和 2的差異
實(shí)現(xiàn)方式1和實(shí)現(xiàn)方式2: 其實(shí)沒什么區(qū)別,無非是一開始就用@time_master來規(guī)定,還是定義完myfunc之后,再多做一步讓myfun放入time_master中去執(zhí)行
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python創(chuàng)建普通菜單示例【基于win32ui模塊】
這篇文章主要介紹了Python創(chuàng)建普通菜單,結(jié)合實(shí)例形式分析了Python基于win32ui模塊創(chuàng)建普通菜單及添加菜單項(xiàng)的相關(guān)操作技巧,并附帶說明了win32ui模塊的安裝命令,需要的朋友可以參考下2018-05-05
跟老齊學(xué)Python之關(guān)于類的初步認(rèn)識(shí)
這篇文章主要介紹了Python中關(guān)于類的一些術(shù)語(yǔ)解釋,雖然有些枯燥,但是要了解類的話,這些內(nèi)容是必須的2014-10-10
在Python的Django框架中更新數(shù)據(jù)庫(kù)數(shù)據(jù)的方法
這篇文章主要介紹了在Python的Django框架中更新數(shù)據(jù)庫(kù)數(shù)據(jù),對(duì)此Django框架中提供了便利的插入和更新方法,需要的朋友可以參考下2015-07-07
Python實(shí)現(xiàn)模擬時(shí)鐘代碼推薦
本文給大家匯總介紹了下使用Python實(shí)現(xiàn)模擬時(shí)鐘的代碼,一共3個(gè)例子,后兩個(gè)是基于QT實(shí)現(xiàn),有需要的小伙伴可以參考下2015-11-11

