如何并行化Scipy优化器

时间:2018-08-31 01:53:25

标签: scipy python-multiprocessing

我正在尝试使用for循环执行一次多启动优化(优化是通过scipy.optimize.minimize完成的)

from scipy.optimize import minimize
def multistart optimizer(func, x):
    x_mins = []
    fvals = []
    n = x.shape[1]
    for i in range(x.shape[0]):
        optRes = minimize(func, x0 = x[i], bounds = ((0,1),)*n, tol = 1.e-6)
        x_mins.append(optRes.x)
        fvals.append(optRes.fun)
    fval = min(fvals)
    x_min = x_mins[np.argmin(fvals)]

    return x_min, fval

这很好,直到初始起点的大小(在这种情况下为x)增加并且执行for循环所需的时间随之增加为止。因此,我想使用多个处理器来加快for循环中的速度(由于每个循环彼此独立,因此应该得到相同的结果) 问题是我真的很不熟悉在python中使用多重处理,并且正在努力寻找正确的代码。有很多涉及“多重处理”模块的示例,但我似乎无法理解如何实现它们。

另一个问题是,所有示例似乎都使用if __name__ == '__main__':在其代码内执行并行化。我想知道是否可以避免这种情况,并且没有它就可以运行并行循环。更确切地说,如果我有一个在文件“ loop.py”中定义的循环,并使用“ main.py”在多个处理器中运行它,那么有可能吗?

1 个答案:

答案 0 :(得分:0)

  

我想知道是否可以避免这种情况,并且在没有它的情况下运行并行循环。更准确地说,如果我有一个在文件loop.py中定义的循环,并使用main.py在多个处理器中运行,那么有可能吗?

是的,可以。

class myThread(threading.Thread):
   def __init__(self, name):
      threading.Thread.__init__(self)
      self.name = name
   def run(self):
      print "Starting " + self.name

您可以创建Thread的子类,然后在任何地方调用它。

如果要在内部使用模型而无需重新初始化,请将其另存为静态或全局对象。