Lru_cache для метода класса, который зависит от атрибута класса (Python)Python

Программы на Python
Ответить
Anonymous
 Lru_cache для метода класса, который зависит от атрибута класса (Python)

Сообщение Anonymous »

У меня есть метод класса Python Test.test(x), который генерирует дорогостоящие данные, т. е. я хотел бы использовать functools.lru_cache в качестве оболочки. Однако выходные данные зависят от атрибута класса Test.a, который может принимать небольшое количество разных значений. Я хотел бы сохранить кешированную версию для каждой комбинации (a, x) атрибута a и параметра x. Т.е. Я хочу, чтобы кеш работал обычным образом, пока атрибут a не изменяется, но метод должен быть переоценен после изменения атрибута класса. Как этого лучше всего достичь?
Вот пример кода:

Код: Выделить всё

from functools import lru_cache

class Test():
a = 1

def __new__(cls, a = 1):
cls.a = a
return super().__new__(cls)

@classmethod
@lru_cache(maxsize=32)
def test(cls, x):
return x * cls.a

print(Test.test(1),Test(2).test(1),Test.test(1))
Желаемый вывод (с отключенным lru_cache): 1 2 2
Вывод с lru_cache: 1 1 1
Некоторые пояснения:
  • Атрибут a меняется редко, поэтому не имеет особого значения, существует ли это кэшированная копия для каждой комбинации (a,x), или сбрасывается ли кэш при каждом изменении значения a.
  • Метод тестирования должен быть реализован таким образом как метод класса (поскольку он наследуется от абстрактного класса, который я не могу изменить).
  • Другие способы передачи значения a для метода по меньшей мере нежелательны. Test(a).test(x) будет правильным способом вызова аналогичных функций проекта.


Подробнее здесь: https://stackoverflow.com/questions/774 ... ute-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»