@cached_property 和 @lru_cache 装饰器之间的区别

django

1个回答

写回答

Z10050805

2025-07-08 01:20

+ 关注

Python
Python

缓存装饰器:@cached_property 和 @lru_cache

Python中,我们经常需要对一些函数或属性进行缓存,以提高程序的性能和效率。Python中有两个常用的装饰器,分别是@cached_property和@lru_cache。尽管它们都可以用于缓存,但它们在实现和使用上有一些不同之处。

@cached_property装饰器

@cached_property装饰器是Python标准库functools中的一个装饰器,它可以用来缓存类的属性。被@cached_property装饰的属性将在首次访问时计算,并将结果保存在实例的__dict__属性中,以便下次访问时直接返回结果,而不需要重新计算。

@cached_property装饰器适用于那些计算成本较高且结果不会变化的属性。它可以有效地避免重复计算,提高程序的性能。

下面是一个使用@cached_property装饰器的例子:

Python

from functools import cached_property

class Circle:

def __init__(self, radius):

self.radius = radius

@cached_property

def area(self):

print("Calculating area...")

return 3.14 * self.radius ** 2

circle = Circle(5)

print(circle.area) # 第一次访问,计算并缓存结果

print(circle.area) # 直接返回缓存的结果

输出结果:

Calculating area...

78.5

78.5

可以看到,第一次访问area属性时,会计算并缓存结果。第二次访问时,直接返回缓存的结果,无需重新计算。

@lru_cache装饰器

@lru_cache装饰器是Python标准库functools中的另一个装饰器,它可以用来缓存函数的返回值。被@lru_cache装饰的函数将会将其参数和返回值的映射关系保存在一个缓存中,以便下次调用时直接返回缓存的结果,而不需要重新执行函数。

@lru_cache装饰器适用于那些具有相同参数值的函数,可以避免重复计算,提高程序的性能。

下面是一个使用@lru_cache装饰器的例子:

Python

from functools import lru_cache

@lru_cache

def fibonacci(n):

if n <= 1:</p> return n

return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10)) # 第一次调用,计算并缓存结果

print(fibonacci(10)) # 直接返回缓存的结果

输出结果:

55

55

可以看到,第一次调用fibonacci函数时,会计算并缓存结果。第二次调用时,直接返回缓存的结果,无需重新计算。

区别和适用场景

@cached_property装饰器适用于类的属性,可以缓存计算成本较高且结果不会变化的属性。它适用于需要频繁访问的属性,可以避免重复计算,提高程序的性能。

@lru_cache装饰器适用于函数的返回值,可以缓存具有相同参数值的函数的计算结果。它适用于具有重复计算的函数,可以避免重复执行函数,提高程序的性能。

因此,根据具体的需求选择合适的装饰器是很重要的,可以根据属性或函数的特点来决定使用@cached_property还是@lru_cache装饰器。

@cached_property和@lru_cache都是Python中常用的缓存装饰器。它们分别适用于类的属性和函数的返回值的缓存,可以避免重复计算,提高程序的性能。根据具体的需求选择合适的装饰器是很重要的,可以根据属性或函数的特点来决定使用@cached_property还是@lru_cache装饰器。

希望本文能够帮助你理解@cached_property和@lru_cache装饰器之间的区别和适用场景,并在实际开发中合理使用它们,优化程序的性能。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号