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

如何使用装饰器在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)时,则直接从缓存中获取结果,避免重复计算。

总结起来,使用装饰器可以很方便地缓存函数的执行结果。通过判断参数以及关键字参数生成缓存键,在调用函数前检查缓存是否存在结果,并将结果存入缓存中。这样可以避免重复计算,提升函数执行的效率。