装饰器实现缓存功能

使用装饰器实现函数缓存

以下代码演示了如何使用装饰器实现函数缓存:

from functools import wraps

def memoize(func):
  """
  缓存函数计算结果的装饰器。
  """
  cache = {}

  @wraps(func)
  def wrapper(*args, **kwargs):
    key = (func.__name__, args, kwargs)
    if key not in cache:
      cache[key] = func(*args, **kwargs)
    return cache[key]
  return wrapper

@memoize
def fibonacci(n):
  """
  计算斐波那契数列的第 n 项。
  """
  if n <= 1:
    return n
  else:
    return fibonacci(n-1) + fibonacci(n-2)

# 计算斐波那契数列的第 10 项
result = fibonacci(10)
print(result)

这段代码定义了一个名为 memoize 的装饰器,它接受一个函数作为参数,并返回一个新的函数。新的函数会缓存原始函数的计算结果,并在下次调用时直接使用缓存结果,避免重复计算。

fibonacci 函数是一个计算斐波那契数列的示例函数。当第一次调用 fibonacci(10) 时,由于缓存为空,函数会进行计算并将其结果存储在缓存中。当再次调用 fibonacci(10) 时,由于结果已经存在于缓存中,函数会直接从缓存中读取结果,而不会进行重复计算。

使用场景

函数缓存可以用于以下场景:

  • 计算代价高昂的函数,例如数据库查询、网络请求等。
  • 频繁调用的函数,例如计算页面元素的位置、格式化文本等。
  • 需要避免重复计算的函数,例如计算数学公式、解析数据等。

注意事项

  • 缓存的大小需要根据实际情况进行设置,过大的缓存可能会占用过多的内存。
  • 缓存的有效期需要根据实际情况进行设置,过短的有效期可能会导致频繁的缓存失效,而过长的有效期可能会导致缓存数据失效。
  • 缓存需要考虑线程安全问题,如果多个线程同时访问缓存,需要使用锁或其他同步机制来保证数据的一致性。
posted @ 2024-04-18 11:49  babyfengfjx  阅读(19)  评论(0编辑  收藏  举报