python3装饰器的高级使用

本文探讨了Python3中装饰器的高级用法,包括利用装饰器实现缓存以优化递归子问题的计算效率,如在斐波那切数列的例子中;探讨了如何在装饰器中保留函数的元数据,通过`functools`模块的`update_wrapper`和`wraps`进行处理;以及介绍了如何创建带参数的装饰器,用于函数参数类型检查和实现可修改属性的函数运行时间监测。
摘要由CSDN通过智能技术生成
#practice26:缓存与装饰器(递归子问题)

对于需要重复计算子问题的情况,可以使用缓存,缓存实现有两种方式:1.在函数内定义某种数据结构存储数据 2.使用装饰器(闭包结构)

菲波那切数列为:1,1,2,3,5,8,13;即从第三项开始,每一项为前两项之和。

以菲波那切数列为例

1、一般的实现方式为:

#求第n项的斐波那契数,从0开始
def fibonacci(n):
    if n <= 1:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(33))

上述函数中由于需要重复计算某些项,所以计算速度非常缓慢,如果在计算过程中能保存一些中间值,速度提升非常明显

2、使用缓存:保存中间值

#方法一:缓存法
#cache以值None层层传递到最底层,然后创建空字典
#cache逐层传递引用,每层的变量cache均指向同一对象!
def fibonacci(n,cache=None):
    if cache is None:
        cache = {}
    if n in cache.keys():
        return cache[n]
    if n <= 1:
        return 1
    cache[n] = fibonacci(n-1,cache) + fibonacci(n-2,cache)
    return cache[n]

print(fibonacci(33))

这种储存中间值的方法不太直观

3、 使用装饰器,利用闭包保存中间值

#方法二:使用装饰器,一来不改变函数形式,二可利用闭包保存变量状态,比缓存法容易理解
def decorator(f):
    cache = {}
    def wrapper(*args,**kargs):
        if args not in cache.keys():
            cache[args] = f(*args,**kargs)
        return cache[args]
    return wrapper

@decorator
def fibonacci(n):
    if n <= 1:
        return 1
    return fibonacci(n-1) + fibonacci(n-2)
pri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值