我正在研究一些使用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))
这应该可以正常工作,除非scipy.optimize.leastsq
不是线程安全的。所以我试着锁定scipy.optimize.leastsq
;瞧,它有效。但是,处理器利用率停留在100%,所以这对我来说毫无用处。
我的问题是,我该怎么办呢?我认为我的选择是:
非常感谢任何帮助或建议。
答案 0 :(得分:2)
使用进程而不是线程会产生影响 - 无论程序是否是线程安全的,它都将起作用。当然,它是否更快取决于解决问题所花费的时间是否大于开销。
使用流程可能需要一些额外的麻烦来设置所有必要的数据。然而,multiprocessing
模块负责大部分工作,因此这不应该太难。
答案 1 :(得分:-1)
有多少CPU /核心?如果没有线程,你所拥有的是100%运行没有任何好处。如果leastq()
不是线程安全的,并且您没有使用100%的计算机,则可以为每个核心运行一个程序实例,并让实例通过文件系统进行同步。