【发布时间】:2011-06-03 15:45:37
【问题描述】:
我正在编写一些使用scipy.optimize.leastsq 优化功能的研究代码。它每次迭代大约执行 18 次,所以我想并行调用 minimumsq 以减少运行时间。这应该不是问题,因为优化几乎是完全独立的,因此只需要很少的同步。我最近发现了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%,所以这对我来说毫无用处。
我的问题是我能做些什么呢?我认为我的选择是:
- 找到 LM 的线程安全实现(也许是 levmar?)
- 尝试使用进程而不是线程(我认为这不会产生影响)
任何帮助或建议将不胜感激。
【问题讨论】:
-
您使用的是 Windows 吗? Windows 上的 optimize.leastsq 中的线程存在一个已知问题:projects.scipy.org/scipy/ticket/1117。
-
嗯,有趣的是我搜索时没有出现。我正在使用 Ubuntu,但它可能会影响两个操作系统。
标签: python multithreading optimization thread-safety scipy