与SciPy.optimize的并行性

Ste*_*eve 5 python optimization multithreading thread-safety scipy

我正在研究一些scipy.optimize.leastsq用于优化功能的研究代码.它每次迭代执行大约18次,所以我想并行调用leastsq以减少运行时间.这应该不是问题,因为优化几乎是完全独立的,因此需要很少的同步.我最近发现了multiprocessing.pool.ThreadPool哪些允许我这样做而无需显式设置共享内存(由于我的大部分数据都在NumPy数组中,所以很痛苦).所以我稍微重写了我的代码,希望它可以工作,但它会抛出一个奇怪的错误:SystemError: null argument to internal routine.

以下是我的代码的简化:

def optfunc(id):
    def errfunc(x):
        return somedata[id] - somefunc(x)

    lock.acquire()
    x0 = numpy.copy(currentx[id])
    lock.release()

    result = scipy.optimize.leastsq(errfunc, x0)

    lock.acquire()
    currentx[id] = result
    lock.release()

ThreadPool(processes=8).map(optfunc, range(idcount))
Run Code Online (Sandbox Code Playgroud)

这应该可以正常工作,除非scipy.optimize.leastsq线程不安全.所以我试着锁定scipy.optimize.leastsq; 瞧,它有效.但是,处理器利用率停留在100%,所以这对我来说毫无用处.

我的问题是,我该怎么办呢?我认为我的选择是:

  1. 找到LM的线程安全实现(levmar,也许?)
  2. 尝试使用进程而不是线程(我不认为这会产生影响)

任何帮助或建议将不胜感激.

Apa*_*ala -1

有多少个 CPU/核心?如果您所拥有的在没有线程的情况下以 100% 运行,则不会有任何好处。如果leastq()不是线程安全的,并且您没有 100% 使用您所拥有的计算机,那么您可以为每个核心运行该程序的一个实例,并让实例通过文件系统进行同步。