logo

Python内置缓存装饰器:@lru_cache, @cache 与 @cached_property

作者:rousong2024.01.17 19:02浏览量:39

简介:在Python中,内置的缓存装饰器可以帮助我们提高函数或属性的性能。这些装饰器包括@lru_cache、@cache和@cached_property。本文将介绍它们的用法和区别。

在Python中,内置的缓存装饰器可以帮助我们提高函数或属性的性能。这些装饰器包括@lru_cache@cache@cached_property。下面我们将详细介绍它们的用法和区别。
1. @lru_cache
@lru_cache是Python标准库中collections模块下的一个装饰器,用于缓存函数或方法的返回值。它使用最近最少使用(LRU)算法来管理缓存项,并支持缓存项的最大数量限制。
示例:

  1. from collections.abc import Callable
  2. from functools import lru_cache
  3. @lru_cache(maxsize=128)
  4. def fibonacci(n):
  5. if n <= 1:
  6. return n
  7. return fibonacci(n-1) + fibonacci(n-2)

在上面的示例中,我们定义了一个计算斐波那契数列的函数,并使用@lru_cache装饰器将其缓存起来。maxsize参数指定了缓存项的最大数量。当调用函数时,如果缓存中已经存在该函数的返回值,则直接返回缓存值,否则计算函数值并缓存起来。
2. @cache
@cache是第三方库cachetools中的一个装饰器,用于缓存函数或方法的返回值。它提供了更灵活的缓存配置,支持基于函数的自定义缓存键和缓存过期时间等特性。
示例:

  1. from cachetools import cached, Cache as CachetoolsCache
  2. from functools import wraps
  3. cache = CachetoolsCache(maxsize=128)
  4. def cache_decorator(func):
  5. @wraps(func)
  6. def wrapper(*args, **kwargs):
  7. key = (func, args, frozenset(kwargs.items()))
  8. return cache.get(key, default=func(*args, **kwargs))
  9. return wrapper

在上面的示例中,我们首先创建了一个CachetoolsCache实例,用于存储缓存项。然后定义了一个装饰器cache_decorator,它接受一个函数作为参数,并返回一个新的函数wrapper。wrapper函数使用functools.wraps来保留原始函数的元信息。在wrapper函数中,我们根据函数及其参数生成一个唯一的缓存键key,并从缓存中获取该键对应的值。如果缓存中不存在该键,则调用原始函数计算值并将其缓存起来。
3. @cached_property
@cached_property是Python内置的装饰器,用于将一个方法的结果缓存为其属性值。它通常用于将计算成本较高的方法结果存储为对象的属性,以避免重复计算。
示例:

  1. class MyClass:
  2. def __init__(self, value):
  3. self.value = value
  4. @cached_property
  5. def expensive_computation(self):
  6. # 计算成本较高的操作,这里只是示例

相关文章推荐

发表评论