from scipy.optimize import minimize
class Memoizer:
def __init__(self):
self.cache = {}
def obj_and_con(self, x):
x_hashable = tuple(x)
if x_hashable in self.cache:
return self.cache[x_hashable]
obj_con = [x @ x, x[0] + x[1] - 1]
self.cache[x_hashable] = obj_con
return obj_con
def fun(self, x):
return self.obj_and_con(x)[0]
def con(self, x):
return self.obj_and_con(x)[1]
memoizer = Memoizer()
x0 = [2, 3]
constraints = {'type': 'eq', 'fun': memoizer.con}
minimize(memoizer.fun, x0, constraints=constraints)
在某些情况下,您可以使用
lru_cache
而不是手动缓存,但是它并不像仅将装饰器应用于
obj_and_con
时那样简单,因为numpy阵列不可用。