使用scipy最小化双参数函数时的性能问题

时间:2015-12-26 21:07:19

标签: python performance function scipy arguments

我有一个2参数的python函数

def foo(x,y):
          // a numeric operation that returns a double

我需要使用scipy.optimize.minimize来定位一个点附近的f的最小点,比如说(1.2,3.4)

我试过

scipy.optimize.minimize(foo, (1.2, 3.4))

scipy.optimize.minimize(foo, [1.2, 3.4])

scipy.optimize.minimize(foo, *[1.2,3.4])

它们都不起作用,产生

TypeError: function takes exactly 2 arguments (1 given)

所以我的唯一解决方案似乎是包装函数,例如

scipy.optimize.minimize(lambda X:foo(*X), [1.2,3.4]),

最后一个有效,但我担心带有lambda术语的额外层会引入不必要的时间开销。因为我的应用程序对性能高度敏感,所以我要求一个有效的解决方案让scipy.optimize.minimize接受foo的输入对,而不会产生潜在的时间开销。任何的想法?谢谢。

1 个答案:

答案 0 :(得分:3)

您应该根据单个(可能是多维)参数定义您的函数。因此,您不使用

def foo(x,y):
      // a numeric operation that returns a double

但是

def foo(x):
      // use x[0] in place of original x
      // and x[1] in place of original y

例如对于你使用的f(x,y)= x + y ^ 2

def foo(x):
    return x[0] + x[1] ** 2

如果您不允许修改foo,那么您可以随时使用其他功能

进行修改
def foowrap(x):
   return foo(x[0], x[1])

这应该稍微高效一点,然后将列表展开到位置参数(*运算符)

只是为了测试

>>> timeit.timeit('foowrap([1,2])', setup='from __main__ import foowrap', number=10000000)
5.230706214904785    
>>> timeit.timeit('foo([1,2])', setup='from __main__ import foo', number=10000000) # this is your lambda term
5.379893779754639

如此非常小的加速,但确实如此。