在python中函数是一等公民。Java中则为类是一等公民。
当一个函数将另一个函数作为输入或返回另一个函数作为输出时,这些函数称为高阶函数。
functools模块是Python的标准库的一部分,它是为高阶函数而实现的,用于增强函数功能。
目录
一、@cache装饰器
它的主要作用是提高函数的执行效率,特别是在函数被多次调用且输入参数相同的情况下,避免重复计算,如果一个函数在相同的输入参数下被多次调用,cache 会记住第一次调用的结果,并在后续调用中直接返回缓存的结果,而不是重新计算。
它是线程安全的,因此可以在多个线程中使用。'
from functools import cache
def factorial(n):
print("无cache执行")
return n
@cache
def factorial_cache(n):
print("执行cache")
return n
if __name__ == '__main__':
for i in range(10):
factorial(10)
factorial_cache(10)
二、@cached_property装饰器
用于将一个类的无参方法转换为缓存属性,意味着该方法在第一次调用时会被计算并缓存结果,后续调用时直接返回缓存的结果。缓存的结果是实例级别的,即每个实例都有自己的缓存。即使后续改变了方法内部涉及的类参数,输出也结果不会发生改变。
from functools import cached_property
class Circle:
def __init__(self, radius):
self.radius = radius
@cached_property
def area(self):
# 如果类本身存在area属性,则此方法不生效。也就是本身属性读取和写入优先于 cached_property 方法
print("计算面积")
return 3.14159 * self.radius ** 2
if __name__ == '__main__':
# 创建 Circle 对象
circle = Circle(5)
# 第一次访问 area 属性时会计算并缓存结果
print(circle.radius, circle.area)
del circle.radius
circle.radius = 60
# 第二次访问 area 属性时直接返回缓存的结果,即使是中途改变了圆的半径或者是删除了参与计算的参数。
print(circle.radius, circle.area)