當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。