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个数值并缓存,所以会直接返回缓存中的结果,不再执行计算过程
以上就是使用装饰器实现方法缓存的示例代码。通过简单的一段代码,我们可以很方便地为我们的函数添加缓存功能,提高代码的执行效率。
