1、python裝飾器
?
?
最基礎的函數
1 def sum1():
2 sum = 1 + 2
3 print(sum)
4 sum1()
查看函數執行用了多長時間,寫了幾句代碼插進去了:
1 import time
2
3 def sum1():
4 start = time.clock()
5 sum = 1+2
6 print(sum)
7 end = time.clock()
8 print("time used:",end - start)
9
10 sum1()
?
可是隨著繼續翻看,對越來越多的函數感興趣了,都想看下他們的運行時間如何,難道要一個一個的去改函數嗎?當然不是!我們可以考慮重新定義一個函數timeit,將sum1的引用傳遞給他,然后在timeit中調用sum1并進行計時,這樣,我們就達到了不改動sum1定義的目的,而且,不論看了多少個函數,我們都不用去修改函數定義了!
import time
def sum1():
sum = 1+ 2
print (sum)
def timeit(func):
start = time.clock()
func()
end =time.clock()
print("time used:", end - start)
timeit(sum1)
咂一看,沒啥問題,可以運行!但是還是修改了一部分代碼,把sum1() 改成了timeit(sum1)。這樣的話,如果sum1在N處都被調用了,你就不得不去修改這N處的代碼。所以,我們就需要楊sum1()具有和timeit(sum1)一樣的效果,于是將timeit賦值給sum1。可是timeit是有參數的,所以需要找個方法去統一參數,將timeit(sum1)的返回值(計算運行時間的函數)賦值給sum1。
1 import time
2
3 def sum1():
4 sum = 1+ 2
5 print (sum)
6
7 def timeit(func):
8 def test():
9 start = time.clock()
10 func()
11 end =time.clock()
12 print("time used:", end - start)
13 return test
14
15 sum1 = timeit(sum1)
16 sum1()
這樣一個簡易的裝飾器就做好了,我們只需要在定義sum1以后調用sum1之前,加上sum1= timeit(sum1),就可以達到計時的目的,這也就是裝飾器的概念,看起來像是sum1被timeit裝飾了!Python于是提供了一個語法糖來降低字符輸入量。
1 import time
2
3 def timeit(func):
4 def test():
5 start = time.clock()
6 func()
7 end =time.clock()
8 print("time used:", end - start)
9 return test
10
11 @timeit
12 def sum1():
13 sum = 1+ 2
14 print (sum)
15
16 sum1()
重點關注第11行的@timeit,在定義上加上這一行與另外寫sum1 = timeit(sum1)完全等價。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

