#python #functools
Вопрос:
У меня проблема с пониманием того, как правильно применять @lru_cache
декоратор. У меня есть словарь attribute
, который вычисляет значения, вызывая другую функцию в списке значений. Я хочу кэшировать любой доступ к attribute
. Есть ли какой-либо способ объявить lru_cache недействительным всякий раз, когда происходит запись some_list
? До сих пор код выглядит следующим образом:
@property
@lru_cache(maxsize=None)
def attribute(self):
attribute = {}
for k in self.some_dict:
attribute[k] = self.complex_computation(self.some_list)
return attribute
Комментарии:
1.
lru_cache
естьclear
способ. С какой проблемой вы это называете?2. Обратите внимание, что там тоже
functools.cached_property
есть . Это может быть более подходящим для кэширования одного атрибута.
Ответ №1:
Это было бы лучше использовать @lru_cache
для вашего self.complex_computation
метода.
@lru_cache
сохраняет function_calls, то есть, в основном, function args return_value. Таким образом, должна существовать зависимость между return
значением и аргументами, но property
у нее нет этой зависимости — вы просто всегда передаете одно и то же self
здесь.
Но self.complex_computation
имеет такой параметр, и он действительно больше подходит для @lru_cache
декоратора. Но помните, что @lru_cache не работает для аргументов списка.
Комментарии:
1.
@lru_cache
не работает для аргументов списка! Он не подходит для примененияself.complex_computation
.2. исправил это только сейчас