@ 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用法及代碼示例
- Python Functools lru_cache()用法及代碼示例
注:本文由純淨天空篩選整理自shubhamkumarlhh大神的英文原創作品 Python Functools – cached_property()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。