装饰器
斐波那契数列之和
def fibonacci(n): if n <=1: return 1 return fibonacci(n-1) + fibonacci(n-2)
这是个递归函数,要反复调用自己,如果n太大调用的次数就越多,无法有效计算
print fibonacci(50)
计算很慢
现添加一个字典缓存免除重复计算
def memo(func): cache = {} def wrap(*args): if args not in cache: cache[args] = func(*args) return cache[args] return wrap
下面这句隐藏装饰类,用以前的方法同样可以打印数列的和,但是速度很快
fibonacci = memo(fibonacci)
print fibonacci(50)
运行结果:
20365011074
[Finished in 0.1s]
语法糖@memo 等同 fibonacci = memo(fibonacci)
def memo(func): cache = {} def wrap(*args): if args not in cache: cache[args] = func(*args) return cache[args] return wrap @memo def fibonacci(n): if n <=1: return 1 return fibonacci(n-1) + fibonacci(n-2) # fibonacci = memo(fibonacci) print fibonacci(50)