python 添加统计运行时间的功能[装饰器]
python 添加统计运行时间的功能[装饰器]
脚本一
没有修改被装饰对象的调用方式,但修改了源代码
#!/bin/python3 # -*- coding: utf-8 -*- import time def index(x,y): start=time.time() print('index %s %s' %(x,y)) stop=time.time() print(stop - start) index(11,22) # python3 time.py index 11 22 6.0558319091796875e-05
脚本二
解决了方案二代码冗余问题,但是带来一个新问题,即函数的调用方式改变了
#!/bin/python3 # -*- coding: utf-8 -*- import time def index(x,y): time.sleep(3) print('index %s %s' %(x,y)) start=time.time() index(11,22) stop=time.time() print(stop - start) start=time.time() #代码冗余,重复代码过多 index(66,88) stop=time.time() print(stop - start) # python3 time1.py index 11 22 3.0020477771759033 index 66 88 3.0020477771759033
脚本三
解决了方案二代码冗余问题,但是带来一个新问题,即函数的调用方式改变了
#!/bin/python3 # -*- coding: utf-8 -*- import time def index(x,y): time.sleep(3) print('index %s %s' %(x,y)) def wrapper (): start=time.time() index(11,22) stop=time.time() print(stop - start) wrapper () # python3 time2.py index 11 22 3.0029959678649902
脚本四
装饰器实现
# cat 1.py #!/bin/python3 # -*- coding: utf-8 -*- import time def index(x,y,z): time.sleep(6) print('index %s %s %s' %(x,y,z)) def home(name): #新增功能代码 time.sleep(6) print('welcome %s to home' %name) return 666 def outter(func): def wrapper (*args,**kwargs): start=time.time() func(*args,**kwargs) stop=time.time() print(stop - start) return wrapper index=outter(index) home=outter(home) #调用新功能。偷梁换柱:home这个名字指向的wrapper函数的内存地址 h=index(22,66,88) print('返回值:',h) res=home('wei') #res=wrapper('wei') l=home(name='wei') print('返回值:',res) print('返回值:',l) # python3 1.py index 22 66 88 6.006062984466553 返回值: None welcome wei to home 6.005392074584961 welcome wei to home 6.001788139343262 返回值: None 返回值: None
脚本五
将wrapper做的像wrapper一样
# cat 1.py #!/bin/python3 # -*- coding: utf-8 -*- import time def index(x,y,z): time.sleep(6) print('index %s %s %s' %(x,y,z)) def home(name): #新增功能代码 time.sleep(6) print('welcome %s to home' %name) return 666 def outter(func): def wrapper (*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() print(stop - start) return res return wrapper index=outter(index) home=outter(home) h=index(22,66,88) print('返回值:',h) res=home('wei') l=home(name='wei') print('返回值:',res) print('返回值:',l) # python3 1.py index 22 66 88 6.004750490188599 返回值: None welcome wei to home 6.0060179233551025 welcome wei to home 6.005538702011108 返回值: 666 返回值: 666
脚本六
使用语法糖@优化
#!/bin/python3 # -*- coding: utf-8 -*- import time def timmer(func): #装饰器 def wrapper (*args,**kwargs): start=time.time() res=func(*args,**kwargs) stop=time.time() print(stop - start) return res return wrapper @timmer #在被装饰对象的正上方的单独一行,写@装饰器名字,相当于index=outter(index) def index(x,y,z): time.sleep(6) print('index %s %s %s' %(x,y,z)) @timmer #相当于home=outter(home) def home(name): #新增功能代码 time.sleep(6) print('welcome %s to home' %name) return 666 index(x=1,y=2,z=3) home('wei') # python3 2.py index 1 2 3 6.005947828292847 welcome wei to home 6.0057384967803955