最基础的函数
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)完全等价。