小编Ste*_*eve的帖子

与SciPy.optimize的并行性

我正在研究一些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. 尝试使用进程而不是线程(我不认为这会产生影响)

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

python optimization multithreading thread-safety scipy

5
推荐指数
1
解决办法
2807
查看次数