我正在研究一些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%,所以这对我来说毫无用处.
我的问题是,我该怎么办呢?我认为我的选择是:
任何帮助或建议将不胜感激.