@ 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()方法并保存该总和时,它都使用相同的,已经计算出的总和值形成昂贵的总和。因此,它减少了执行时间,并使我们的程序更快。
相关用法
- Python functools.wraps()用法及代码示例
- Python Functools update_wrapper()用法及代码示例
- Python Functools total_ordering()用法及代码示例
- Python Functools lru_cache()用法及代码示例
注:本文由纯净天空筛选整理自shubhamkumarlhh大神的英文原创作品 Python Functools – cached_property()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。