簡體   English   中英

python 如何記憶一個方法

[英]python how to memoize a method

假設我有一種從給定參數創建字典的方法:

def newDict(a,b,c,d): # in reality this method is a bit more complex, I've just shortened for the sake of simplicity
    return { "x": a,
             "y": b,
             "z": c,
             "t": d }

我還有另一種方法,每次執行時都會調用 newDict 方法。 因此,最后,當我查看我的 cProfiler 時,我會看到如下內容:

17874 calls (17868 primitive) 0.076 CPU seconds

當然,我的 newDict 方法被調用了1785次。 現在,我的問題是我是否可以記住 newDict 方法以減少調用時間? (只是為了確保變量幾乎在每次調用中都會發生變化,盡管我不確定它是否對記憶函數有影響)

子問題:我認為17k調用太多了,代碼效率不高。 但是通過查看統計數據,您是否也可以請 state 這是正常結果還是我有太多電話並且代碼很慢?

  1. 你的意思是memoize不是memorize
  2. 如果值幾乎總是不同的,記憶將無濟於事,它會減慢速度。
  3. 如果沒有看到你的完整代碼,也不知道它應該做什么,我們怎么知道 17k 調用是多還是少?

如果通過記憶你的意思是記憶,使用functools.lru_cache 這是一個 function 裝飾器

記憶的目的是保存執行成本高昂的操作的結果,以便可以為其提供第二次、第三次等時間,而不必重復操作並重復產生費用。

記憶通常應用於 function,它 (a) 執行昂貴的操作,(b) 在相同的 arguments 下總是產生相同的結果,並且 (c) 對程序 Z9ED39E2EA931586B3A985A6942EZEF5 沒有副作用。

記憶通常在這樣的 function 中通過“保存”結果以及產生該結果的 arguments 的值來實現。 這是緩存一般概念的一種特殊形式。 每次調用 function 時,function 都會檢查其備忘錄緩存,以查看它是否已經確定了適合 arguments 的當前值的結果。 如果緩存中包含結果,則無需重新計算即可返回。

您的 function 似乎是為了在每次調用它時創建一個新的字典。 似乎沒有一種明智的方式來記憶這個 function:您總是希望將一個新的字典返回給調用者,以便它使用它收到的字典不會干擾對 function 的其他調用。

我可以使用 memoizing 進行可視化的唯一方法是(1)計算一個或多個放入結果中的值很昂貴(在這種情況下,我可能會定義一個 function 來計算值並記住該函數)或( 2) newDict function 旨在返回給定一組特定參數值的相同值集合。 在后一種情況下,我不會使用字典,而是使用不可修改的 object (例如,像字典一樣的 class ,但可以防止修改其內容)。

關於您的子問題,您需要問的問題是(1)是正確調用 newDict 的次數,(2)是否可以減少每次執行 newDict 的執行時間。 這是兩個獨立的問題,需要酌情單獨解決。

順便說一句,您的 function 定義中有錯字——返回關鍵字和左大括號之間不應有“d”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM