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

Python装饰器实现方法缓存的示例代码

发布时间:2023-12-18 02:41:50

装饰器是Python中一种非常有用的编程技术,可以在不修改原始函数代码的情况下,对其功能进行扩展或修饰。其中一种常见的应用场景是实现方法缓存,即将方法执行的结果缓存起来,下次调用时可以直接返回缓存值,从而提高程序的执行效率。

下面是一个示例代码,演示了如何使用装饰器实现方法缓存的功能:

import functools

def cache(func):
    # 使用functools库提供的wraps装饰器,保持被装饰函数的元数据
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        # 检查缓存中是否已经有该函数的结果,如果有直接返回
        cache_key = str(args) + str(kwargs)
        if cache_key in wrapper.cache:
            return wrapper.cache[cache_key]
        
        # 如果缓存中没有,则调用原始函数,并将结果放入缓存中
        result = func(*args, **kwargs)
        wrapper.cache[cache_key] = result
        return result
    
    # 初始化缓存字典
    wrapper.cache = {}
    return wrapper

该装饰器函数接受一个函数作为参数,并返回一个经过包装后的函数。被装饰的函数将会在执行前进行缓存的检查和结果的存储。

下面给出一个使用该装饰器的例子,假设我们有一个耗时较长的方法,用于计算斐波那契数列的第n个数值:

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

如果我们多次调用fib函数来计算不同的斐波那契数值,由于使用了缓存机制,后续的计算过程将会大大加快。例如:

print(fib(10))  # 第10个斐波那契数为55,会进行计算
print(fib(11))  # 由于上一步已经计算过第10个数值,所以会直接返回缓存中的结果,不再执行计算过程
print(fib(10))  # 由于之前已经计算过第10个数值并缓存,所以会直接返回缓存中的结果,不再执行计算过程

以上就是使用装饰器实现方法缓存的示例代码。通过简单的一段代码,我们可以很方便地为我们的函数添加缓存功能,提高代码的执行效率。