装饰器: 把被装饰的函数替换成新函数,二者接受相同的参数,而且(通常)返回被装饰的函数本该返回的值,
同时还会做些额外操作。
同时可以实现: 装饰器模式(动态地给一个对象添加一些额外的职责)
一个简单的装饰器例子
def deco(func):
def inner(*args):
print("[INFO] running inner()")
result = func(*args)
return result
return inner
@deco
def target():
print("[INFO] running target()")
target() #[INFO] running inner()
#[INFO] running target()
标准库中的一个装饰器: functools.lru_cache
functools.lru_cache(maxsize=128, typed=False) 是非常实用的装饰器,它实现了备忘(memoization)功能
这是一项优化技术,它把耗时的函数的结果保存起来,避免传入相同的参数时重复计算
参数 :
maxsize: maxsize 参数指定存储多少个调用的结果,存满了之后,旧的结果会被扔掉,腾出空
间。为了得到最佳性能,maxsize 应该设为 2 的幂
typed 参数如果设为 True,把不同参数类型得到的结果分开保存,即把通常认为相等的浮点数
和整数参数(如 1 和 1.0)区分开
simple:
import functools
@functools.lru_cache()
@clock #统计时间的装饰器
def fabonaqie(n):
if(n < 2):
return n
return fabonaqie(n - 2) + fabonaqie(n - 1)
print(fabonaqie(5))
print(fabonaqie(5))
#####################
[0.00000200s] fabonaqie(1) -> 1
[0.00000240s] fabonaqie(0) -> 0
[0.00002840s] fabonaqie(2) -> 1
[0.00010980s] fabonaqie(3) -> 2
[0.00000250s] fabonaqie(4) -> 3
[0.00014510s] fabonaqie(5) -> 5
5
5
可见两次计算斐波那契数列, 只执行了一次函数