Python内置缓存装饰器:@lru_cache, @cache 与 @cached_property
2024.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)算法来管理缓存项,并支持缓存项的最大数量限制。
示例:
from collections.abc import Callablefrom functools import lru_cache@lru_cache(maxsize=128)def fibonacci(n):if n <= 1:return nreturn fibonacci(n-1) + fibonacci(n-2)
在上面的示例中,我们定义了一个计算斐波那契数列的函数,并使用@lru_cache装饰器将其缓存起来。maxsize参数指定了缓存项的最大数量。当调用函数时,如果缓存中已经存在该函数的返回值,则直接返回缓存值,否则计算函数值并缓存起来。
2. @cache
@cache是第三方库cachetools中的一个装饰器,用于缓存函数或方法的返回值。它提供了更灵活的缓存配置,支持基于函数的自定义缓存键和缓存过期时间等特性。
示例:
from cachetools import cached, Cache as CachetoolsCachefrom functools import wrapscache = CachetoolsCache(maxsize=128)def cache_decorator(func):@wraps(func)def wrapper(*args, **kwargs):key = (func, args, frozenset(kwargs.items()))return cache.get(key, default=func(*args, **kwargs))return wrapper
在上面的示例中,我们首先创建了一个CachetoolsCache实例,用于存储缓存项。然后定义了一个装饰器cache_decorator,它接受一个函数作为参数,并返回一个新的函数wrapper。wrapper函数使用functools.wraps来保留原始函数的元信息。在wrapper函数中,我们根据函数及其参数生成一个唯一的缓存键key,并从缓存中获取该键对应的值。如果缓存中不存在该键,则调用原始函数计算值并将其缓存起来。
3. @cached_property
@cached_property是Python内置的装饰器,用于将一个方法的结果缓存为其属性值。它通常用于将计算成本较高的方法结果存储为对象的属性,以避免重复计算。
示例:
class MyClass:def __init__(self, value):self.value = value@cached_propertydef expensive_computation(self):# 计算成本较高的操作,这里只是示例

发表评论
登录后可评论,请前往 登录 或 注册