![](/img/trans.png)
[英]How do I use cache_clear() on python @functools.lru_cache
[英]How to use Python decorators so that a method uses functools.lru_cache andregisters itself?
我正在裝飾 class 中的一些方法,這些方法使用 lru_cache 訪問數據存儲。 我想應用另一個裝飾器,或者以另一種方式調用 lru_cache,以便在第一次調用時將緩存方法添加到集合中。 這樣,當我知道我的數據存儲區變臟時,我可以清理每個方法的緩存。 換句話說,我如何在下面構建“register_data_reader”? 或者我應該換一種方式嗎?
from functools import lru_cache
class foo:
_cached_funcs = set()
@register_data_reader # adds the LRU DECORATED func to _cached_funcs
@lru_cache(maxsize=16)
def reads_data_somewhere(self, ...)
...
return data
def clear_cache(self):
for f in _cached_funcs:
f.cache_clear()
只是想一想如何實現這個......為什么還要費心用裝飾器注冊方法並在_cache_funcs
中跟蹤它們? 而是遍歷類方法並嘗試在它們上運行.cache_clear()
?
class Foo:
@lru_cache(maxsize=16)
def reads_data_somewhere(self):
return 2 + 2
def clear_cache(self):
for method in dir(self):
try:
getattr(self, method).cache_clear()
except AttributeError:
pass
f = Foo()
print(f.reads_data_somewhere())
print(f.reads_data_somewhere())
print(f.reads_data_somewhere())
print(f.reads_data_somewhere())
print(f.reads_data_somewhere.cache_info())
f.clear_cache()
print(f.reads_data_somewhere.cache_info())
Output:
4
4
4
4
CacheInfo(hits=3, misses=1, maxsize=16, currsize=1)
CacheInfo(hits=0, misses=0, maxsize=16, currsize=0)
謝謝特里,這很有用。
最后,受您的啟發,我在 class 的init中運行了以下方法。 它允許我繞過拋出異常,並且我正在注冊一次緩存的方法,因為與總數相比,它們相對較少。
Class foo:
...
def _register_cache(self):
lst = dir(self)
for method in lst:
if hasattr(getattr(self, method), "cache_info"):
self._cached_methods.add(method)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.