欢迎访问宙启技术站
智能推送

使用装饰器来实现缓存功能的例子

发布时间:2023-12-15 19:57:22

使用装饰器可以很方便地实现缓存功能,这里提供一个简单的例子,来说明如何使用装饰器来实现缓存功能。

首先,我们定义一个装饰器函数,它接受一个被装饰的函数作为参数,并返回一个新的函数。

def cache(func):
    # 使用字典来作为缓存
    cache_dict = {}

    # 定义一个新的函数来包装原函数
    def wrapper(*args, **kwargs):
        # 把参数转化为hashable的形式,以便作为字典的key
        key = tuple(args) + tuple(sorted(kwargs.items()))

        if key not in cache_dict:
            # 如果缓存中不存在,则调用原函数,并把结果保存到缓存中
            result = func(*args, **kwargs)
            cache_dict[key] = result
        else:
            # 如果缓存中存在,则直接返回缓存的结果
            result = cache_dict[key]

        return result

    return wrapper

然后,我们定义一个示例函数来测试缓存功能。这个函数计算斐波那契数列的第n个数。

@cache
def fibonacci(n):
    if n < 2:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

现在,我们可以使用这个装饰器来调用fibonacci函数,并观察结果。

print(fibonacci(10))  # 第10个斐波那契数是55
print(fibonacci(20))  # 第20个斐波那契数是6765

次调用fibonacci函数时,缓存中还没有结果,所以会调用原函数来计算结果,并把结果保存到缓存中。第二次调用fibonacci函数时,由于参数相同,缓存中已经存在结果,所以直接返回缓存中的结果,而不再调用原函数。

这样,通过使用装饰器,我们就成功地实现了缓存功能,可以有效地提高函数的性能。这在需要频繁调用相同参数的函数时特别有用,可以避免重复计算。