装饰器

斐波那契数列之和

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)

 

posted @ 2020-09-22 19:17  Edward_han  阅读(60)  评论(0编辑  收藏  举报