簡體   English   中英

是否有為python建立的memoize on-disk裝飾器?

[英]Is there an established memoize on-disk decorator for python?

我一直在尋找一個python模塊,它提供了一個具有以下功能的memoize裝飾器:

  • 將緩存存儲在磁盤上以便在后續程序運行中重用。
  • 適用於任何可選擇的參數,最重要的是numpy數組。
  • (Bonus)檢查參數是否在函數調用中發生變異。

我找到了一些用於此任務的小代碼片段,並且可能自己實現了一個,但我更願意為此任務創建一個已建立的軟件包。 我也發現了incpy ,但這似乎不適用於標准的python解釋器。

理想情況下,我希望在磁盤上有functools.lru_cache和緩存存儲。 有人能指點我這個合適的套餐嗎?

我意識到這是一個有兩年之久的問題,而且這不會算作“已建立”的裝飾者,而是......

這很簡單,你真的不需要擔心只使用已建立的代碼。 該模塊的文檔鏈接到源,因為除了它本身有用之外,它還可以作為示例代碼。

那么,你需要添加什么? 添加filename參數。 在運行時, pickle.load將文件名pickle.loadcache ,如果失敗則使用{} 添加一個cache_save函數,只需將緩存pickle.save的緩存添加到鎖定下的文件中。 將該函數附加到與現有函數相同的wrappercache_info等)。

如果您想自動保存緩存,而不是將其留給調用者,那很容易; 這只是一個什么時候這樣做的問題。 你提出的任何選項 - atexit.register ,添加一個save_every參數,以便它保存每個save_every未命中,...... - 實現起來很簡單。 這個答案中,我展示了它的工作量很少。 或者你可以在GitHub上獲得一個完整的工作版本(定制或使用原樣)。

還有其他方法可以擴展它 - 在cache_info放置一些與保存相關的統計信息(自上次保存以來的最后保存時間,命中和未命中,...),復制緩存並將其保存在后台線程中,而不是將其保存cache_info聯中,等等但我想不出任何值得做的事情並不容易。

我不知道任何memoize裝飾器負責所有這些,但你可能想看看ZODB 它是一個構建在pickle之上的持久性系統,它提供了一些額外的功能,包括能夠在不使用時將對象從內存移動到磁盤,以及只保存已修改的對象的能力。

編輯:作為評論的后續行動。 ZODB不支持開箱即用的裝飾裝飾器。 但是,我認為你可以:

  • 實現自己的持久化類
  • 在您需要的方法中使用memoization裝飾器(任何標准實現都應該工作,但可能需要修改它以確保設置臟位

之后,如果您創建該類的對象並將其添加到ZODB數據庫,則在執行其中一個memoized方法時,該對象將被標記為臟,並且更改將在下一個事務提交操作中保存到數據庫中。

暫無
暫無

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

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