Очистите кэш lru_cache functool после записи структуры данных

#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. исправил это только сейчас