gpt4 book ai didi

python - 更新类的属性时清除某些方法的 lru_cache?

转载 作者:太空宇宙 更新时间:2023-11-04 00:32:29 24 4
gpt4 key购买 nike

我有一个带有方法/属性 multiplier 的对象。这个方法在我的程序中被多次调用,所以我决定在它上面使用lru_cache()来提高执行速度。正如预期的那样,它要快得多:

下面的代码显示了问题:

from functools import lru_cache

class MyClass(object):
def __init__(self):
self.current_contract = 201706
self.futures = {201706: {'multiplier': 1000},
201712: {'multiplier': 25}}

@property
@lru_cache()
def multiplier(self):
return self.futures[self.current_contract]['multiplier']

CF = MyClass()
assert CF.multiplier == 1000

CF.current_contract = 201712
assert CF.multiplier == 25

第二个 assert 失败,因为缓存值为 1000,因为 lru_cache() 不知道基础属性 current_contract 已更改。

有没有办法在self.current_contract更新时清除缓存?

谢谢!

最佳答案

是的,非常简单:将 current_contract 设置为读/写属性并清除属性 setter 中的缓存:

from functools import lru_cache

class MyClass(object):
def __init__(self):
self.futures = {201706: {'multiplier': 1000},
201712: {'multiplier': 25}}
self.current_contract = 201706

@property
def current_contract(self):
return self._current_contract

@current_contract.setter
def current_contract(self, value):
self._current_contract = value
type(self).multiplier.fget.cache_clear()

@property
@lru_cache()
def multiplier(self):
return self.futures[self.current_contract]['multiplier']

注意:我假设您的实际用例涉及昂贵的计算,而不仅仅是字典查找 - 否则 lru_cache 可能有点矫枉过正 ;)

关于python - 更新类的属性时清除某些方法的 lru_cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45282631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com