当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Functools cached_property()用法及代码示例


@ cached_property是一个修饰符,它将一个类的方法转换为一个属性,该属性的值仅计算一次,然后作为常规属性进行缓存。因此,只要实例持续存在,就可以使用缓存的结果,并且我们可以将该方法用作类的属性,即

Writing   :instance.method
Instead of:instance.method()

cached_property是Python中functools模块的一部分。它类似于property(),但是cached_property()带有一项额外函数,即正在缓存。

注意:有关更多信息,请参见Python中的Functools模块。

为什么要缓存?

高速缓冲存储器是CPU内部可用的high-speed存储器,目的是加快对数据和指令的访问。因此,缓存是一个可以快速访问的地方。可以一次计算并存储该结果,从下一次开始,就可以访问该结果,而无需再次重新计算。因此,在进行昂贵的计算时很有用。

@property和@ cached_property之间的区别:



# Using @property 
  
# A sample class 
class Sample():
  
    def __init__(self):
      self.result = 50
  
    @property
    # a method to increase the value of 
    # result by 50 
    def increase(self):
        self.result = self.result + 50
        return self.result 
  
# obj is an instance of the class sample 
obj = Sample() 
print(obj.increase) 
print(obj.increase) 
print(obj.increase)

OUTPUT

100
150
200

相同的代码,但是现在我们使用@ cached_property代替@property

# Using @cached_property 
  
from functools import cached_property 
  
# A sample class 
class Sample():
  
    def __init__(self):
      self.result = 50
  
    @cached_property
    # a method to increase the value of 
    # result by 50 
    def increase(self):
        self.result = self.result + 50
        return self.result 
  
# obj is an instance of the class sample 
obj = Sample() 
print(obj.increase) 
print(obj.increase) 
print(obj.increase)

OUTPUT

100
100
100

您可以清楚地看到,使用@property会在每次调用increase()方法时计算结果的值,这就是为什么其值增加50的原因。@cached_property,结果值仅计算一次,然后存储在缓存中,因此每次调用increase()方法时都可以访问它,而无需重新计算结果值,因此这就是每次输出都显示100的原因。

但是,它如何减少执行时间并使程序更快?
考虑以下示例:

# Without using @cached_property 
  
# A sample class 
class Sample():
  
    def __init__(self, lst):
      self.long_list = lst 
  
    # a method to find the sum of the  
    # given long list of integer values 
    def find_sum(self):
        return (sum(self.long_list)) 
  
# obj is an instance of the class sample 
# the list can be longer, this is just 
# an example 
obj = Sample([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 
print(obj.find_sum()) 
print(obj.find_sum()) 
print(obj.find_sum())

OUTPUT

55
55
55

在这里,假设如果我们传递一长串值,则每次find_sum()方法被调用,从而花费大量时间执行,并且我们的程序最终将变慢。我们想要的是,由于列表在创建实例后不会更改,因此,如果列表的总和仅计算一次,而不是每次调用该方法并希望每次访问该方法时都不会计算,那就很好了。和。这可以通过使用@ cached_property来实现

例:

# With using @cached_property 
  
from functools import cached_property 
  
# A sample class 
class Sample():
    def __init__(self, lst):
      self.long_list = lst 
  
    # a method to find the sum of the 
    # given long list of integer values 
    @cached_property
    def find_sum(self):
        return (sum(self.long_list)) 
  
# obj is an instance of the class sample 
obj = Sample([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) 
print(obj.find_sum) 
print(obj.find_sum) 
print(obj.find_sum)

OUTPUT

55
55
55

尽管输出是相同的,但是它大大减少了执行时间。创建实例时传递的列表总和仅计算一次并存储在高速缓存中,此后,每次我们调用find_sum()方法并保存该总和时,它都使用相同的,已经计算出的总和值形成昂贵的总和。因此,它减少了执行时间,并使我们的程序更快。




相关用法


注:本文由纯净天空筛选整理自shubhamkumarlhh大神的英文原创作品 Python Functools – cached_property()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。