使用装饰器来实现缓存功能的例子
发布时间: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函数时,由于参数相同,缓存中已经存在结果,所以直接返回缓存中的结果,而不再调用原函数。
这样,通过使用装饰器,我们就成功地实现了缓存功能,可以有效地提高函数的性能。这在需要频繁调用相同参数的函数时特别有用,可以避免重复计算。
