Для memoize f(x)
можно использовать functools.lru_cache()
:Как memoize метод, когда один из его memoized параметров должен быть экземпляр переменной
class A(object):
def __init(self):
self.time = 10 # This changes in the various spots in the program
@functools.lru_cache(maxsize=None)
def f(self, x):
# Lots of code
# ...
# ...
return x * some_other_func(self.time)
(в моем понимании) lru_cache()
создает Dict с различными x
как ключи и соответствующие им f(x)
как значения, так что он возвращает сохраненные значения, если я вызываю f()
с тем же значением аргумента, а не пересчитываю его. Однако это не то, что мне нужно.
Моя цель состоит в том, чтобы memoize f()
значения для различных значений какx
иself.time
.
Используя следующий код достигает своей цели:
class A(object):
def __init(self):
self.time = 10
@functools.lru_cache(maxsize=None)
def g(self, x, t):
# Lots of code
# ...
# ...
return x * some_other_func(self.time)
def f(self, x):
return self.g(x=x, t=self.time)
Теперь вместо memoizing f(x)
непосредственно, я memoize g()
, который всегда вызывается с t=self.time
.
Однако я не уверен, является ли это самым чистым решением. Я ожидал бы использовать декоратор для memoization и не создавать промежуточные методы.
Есть ли менее грязный способ достижения вышеуказанного? (Мне нужно будет сделать выше для нескольких методов, поэтому я ищу решение как можно более чистым)
Даже если 'self' был в области при настройке аргументов по умолчанию, значения по умолчанию игнорируются кешированием. Либо придерживайтесь того, что у вас есть, либо реализуйте кеш самостоятельно. – jonrsharpe
@jonrsharpe Прошу прощения, это не то, что я имел в виду. Я удалил его с поста. Мне нужно просто принять во внимание переменную, которая не является частью параметров 'f()', но не знает, как это объяснить. –
Ваше решение кажется прекрасным для меня – yurib