
Python
缓存装饰器:@cached_property 和 @lru_cache
在Python中,我们经常需要对一些函数或属性进行缓存,以提高程序的性能和效率。Python中有两个常用的装饰器,分别是@cached_property和@lru_cache。尽管它们都可以用于缓存,但它们在实现和使用上有一些不同之处。@cached_property装饰器@cached_property装饰器是Python标准库functools中的一个装饰器,它可以用来缓存类的属性。被@cached_property装饰的属性将在首次访问时计算,并将结果保存在实例的__dict__属性中,以便下次访问时直接返回结果,而不需要重新计算。@cached_property装饰器适用于那些计算成本较高且结果不会变化的属性。它可以有效地避免重复计算,提高程序的性能。下面是一个使用@cached_property装饰器的例子:Pythonfrom functools import cached_propertyclass Circle: def __init__(self, radius): self.radius = radius @cached_property def area(self): print("Calculating area...") return 3.14 * self.radius ** 2circle = Circle(5)print(circle.area) # 第一次访问,计算并缓存结果print(circle.area) # 直接返回缓存的结果输出结果:Calculating area...78.578.5可以看到,第一次访问area属性时,会计算并缓存结果。第二次访问时,直接返回缓存的结果,无需重新计算。@lru_cache装饰器@lru_cache装饰器是Python标准库functools中的另一个装饰器,它可以用来缓存函数的返回值。被@lru_cache装饰的函数将会将其参数和返回值的映射关系保存在一个缓存中,以便下次调用时直接返回缓存的结果,而不需要重新执行函数。@lru_cache装饰器适用于那些具有相同参数值的函数,可以避免重复计算,提高程序的性能。下面是一个使用@lru_cache装饰器的例子:
Pythonfrom functools import lru_cache@lru_cachedef fibonacci(n): if n <= 1:</p> return n return fibonacci(n-1) + fibonacci(n-2)print(fibonacci(10)) # 第一次调用,计算并缓存结果print(fibonacci(10)) # 直接返回缓存的结果输出结果:
5555可以看到,第一次调用fibonacci函数时,会计算并缓存结果。第二次调用时,直接返回缓存的结果,无需重新计算。区别和适用场景@cached_property装饰器适用于类的属性,可以缓存计算成本较高且结果不会变化的属性。它适用于需要频繁访问的属性,可以避免重复计算,提高程序的性能。@lru_cache装饰器适用于函数的返回值,可以缓存具有相同参数值的函数的计算结果。它适用于具有重复计算的函数,可以避免重复执行函数,提高程序的性能。因此,根据具体的需求选择合适的装饰器是很重要的,可以根据属性或函数的特点来决定使用@cached_property还是@lru_cache装饰器。@cached_property和@lru_cache都是Python中常用的缓存装饰器。它们分别适用于类的属性和函数的返回值的缓存,可以避免重复计算,提高程序的性能。根据具体的需求选择合适的装饰器是很重要的,可以根据属性或函数的特点来决定使用@cached_property还是@lru_cache装饰器。希望本文能够帮助你理解@cached_property和@lru_cache装饰器之间的区别和适用场景,并在实际开发中合理使用它们,优化程序的性能。
Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号