python 装饰器
Posted 北边的大鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 装饰器相关的知识,希望对你有一定的参考价值。
一、装饰器的形成
需求1: 用一段代码测试一下函数的执行效率
import time print(time.time()) # 输出当前时间 def func1(): time.sleep(1) # 等待1秒 print(111) def func2(): time.sleep(1) print(222) start_time = time.time() # 开始时间 func1() # 执行此函数 end_time = time.time() # 结束时间 print(‘此函数的执行时间是%s‘ % (end_time-start_time)) # 输出执行时间 =结束时间-开始时间 start_time = time.time() func2() end_time = time.time() print(‘此函数的执行时间是%s‘ % (end_time-start_time))
但是如果有多个函数,都想测试他们的执行时间,是不是每次都得func1 = timer(func1)?
这样还是有点麻烦,因为这些函数的函数名可能是不相同,有func1,func2,graph,等等
第一版本不好,重复造轮子,测试函数的效率 必须得复制代码测试。
改版:使用函数
# 将代码封装到函数中,基本完成 import time def func1(): time.sleep(1) print(111) def func2(): time.sleep(1) print(222) def timmer(f): start_time = time.time() f() end_time = time.time() print(‘此函数的执行时间是%s‘ % (end_time-start_time)) timmer(func1) timmer(func2)
需求2: 生产环境测试函数的真正的执行效率:线上500个函数
线上问题:
线上的函数你不改变
函数的原本的调用方式不能改变
原本线上的调用方式:
func1
func2
但是用了测试效率的函数之后
def timmer(f):
start_time = time.time()
f()
end_time = time.time()
print(‘此函数的执行时间是%s‘ % (end_time-start_time))
此时已经改变了函数的调用方式:
func1()
timmer(func1)
没有改变函数里面的函数体,但是改变了函数的调用方法,所以要解决:用最少的代码,解决调用方式一致性的问题。
最终完成的需求 func1() 这个指令既要执行func1函数,又要测试效率
# 利用闭包,在不改变函数体的情况下 import time def func1(): time.sleep(1) print(111) def func2(): time.sleep(1) print(222) def timmer(f): # f = func1 函数的内存地址 def inner(): start_time = time.time() f() end_time = time.time() print(‘此函数的执行时间是%s‘ % (end_time-start_time)) return inner func1 = timmer(func1) # = inner func1() # inner() def func1(): print(func1) func1 = 777 print(func1)
以上是关于python 装饰器的主要内容,如果未能解决你的问题,请参考以下文章