如何使用装饰器在Python中缓存函数的执行结果
发布时间:2023-12-15 20:02:42
在Python中,可以使用装饰器来缓存函数的执行结果,以避免重复计算。
以下是一个缓存函数执行结果的装饰器的示例代码:
import functools
def cache(func):
"""
缓存函数执行结果的装饰器
"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
cache_key = (args, frozenset(kwargs.items()))
if cache_key not in wrapper.cache:
# 如果缓存中不存在该结果,则调用被装饰的函数
result = func(*args, **kwargs)
wrapper.cache[cache_key] = result
return wrapper.cache[cache_key]
# 初始化缓存字典
wrapper.cache = {}
return wrapper
在上面的代码中,定义了一个名为cache的装饰器函数。该装饰器接受一个函数作为参数,并返回一个新的函数wrapper。在wrapper函数内部,首先会生成一个缓存键cache_key,该键由函数的参数和关键字参数组成。然后会检查该键是否在缓存字典wrapper.cache中,如果不存在,则调用被装饰的函数并将结果存入缓存字典,然后返回结果;如果存在,则直接从缓存中获取结果并返回。
使用该装饰器可以很方便地缓存函数的执行结果。下面是一个使用该装饰器的例子:
@cache
def fibonacci(n):
if n < 2:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10)) # 第10个斐波那契数为55,计算结果会被缓存
print(fibonacci(10)) # 直接从缓存中获取结果
在上面的代码中,fibonacci函数使用了cache装饰器进行缓存。首次调用fibonacci(10)时,会进行计算并将结果缓存。而后续再次调用fibonacci(10)时,则直接从缓存中获取结果,避免重复计算。
总结起来,使用装饰器可以很方便地缓存函数的执行结果。通过判断参数以及关键字参数生成缓存键,在调用函数前检查缓存是否存在结果,并将结果存入缓存中。这样可以避免重复计算,提升函数执行的效率。
