定義一個(gè)函數(shù):
def sum1():
sum = 1+ 2
print (sum)
想看看這個(gè)函數(shù)執(zhí)行用了多長(zhǎng)時(shí)間,所以寫(xiě)了幾句代碼插進(jìn)去了:
import time
def sum1():
start = time.clock()
sum = 1+2
print(sum)
end = time.clock()
print("time used:",end - start)
sum1()
運(yùn)行之后,完美~~
可是隨著繼續(xù)翻看,小P對(duì)越來(lái)越多的函數(shù)感興趣了,都想看下他們的運(yùn)行時(shí)間如何,難道要一個(gè)一個(gè)的去改函數(shù)嗎?當(dāng)然不是!我們可以考慮重新定義一個(gè)函數(shù)timeit,將sum1的引用傳遞給他,然后在timeit中調(diào)用sum1并進(jìn)行計(jì)時(shí),這樣,我們就達(dá)到了不改動(dòng)sum1定義的目的,而且,不論小P看了多少個(gè)函數(shù),我們都不用去修改函數(shù)定義了!
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)
咂一看,沒(méi)啥問(wèn)題,可以運(yùn)行!但是還是修改了一部分代碼,把sum1() 改成了timeit(sum1)。這樣的話(huà),如果sum1在N處都被調(diào)用了,你就不得不去修改這N處的代碼。所以,我們就需要楊sum1()具有和timeit(sum1)一樣的效果,于是將timeit賦值給sum1??墒莟imeit是有參數(shù)的,所以需要找個(gè)方法去統(tǒng)一參數(shù),將timeit(sum1)的返回值(計(jì)算運(yùn)行時(shí)間的函數(shù))賦值給sum1。
import time
def sum1():
sum = 1+ 2
print (sum)
def timeit(func):
def test():
start = time.clock()
func()
end =time.clock()
print("time used:", end - start)
return test
sum1 = timeit(sum1)
sum1()
這樣一個(gè)簡(jiǎn)易的裝飾器就做好了,我們只需要在定義sum1以后調(diào)用sum1之前,加上sum1= timeit(sum1),就可以達(dá)到計(jì)時(shí)的目的,這也就是裝飾器的概念,看起來(lái)像是sum1被timeit裝飾了!Python于是提供了一個(gè)語(yǔ)法糖來(lái)降低字符輸入量。
import time
def timeit(func):
def test():
start = time.clock()
func()
end =time.clock()
print("time used:", end - start)
return test
@timeit
def sum1():
sum = 1+ 2
print (sum)
sum1()
重點(diǎn)關(guān)注第11行的@timeit,在定義上加上這一行與另外寫(xiě)sum1 = timeit(sum1)完全等價(jià)。
示例:
#!/usr/bin/python
import time
def sum1():
sum = 1+ 2
print (sum)
def timeit(func):
def test():
start = time.clock()
func()
end =time.clock()
print("time used:", end - start)
return test
def ppp():
for i in ['a','b','c']:
time.sleep(1)
print i
ppp = timeit(ppp)
ppp()
sum1 = timeit(sum1)
sum1()
運(yùn)行結(jié)果:
[root@dev ~]# python d.py
a
b
c
('time used:', 0.0)
3
('time used:', 0.0)