与SciPy.optimize的并行性

时间:2011-01-04 20:57:16

标签: python multithreading optimization 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))

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

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

  1. 找到LM的线程安全实现(levmar,也许?)
  2. 尝试使用进程而不是线程(我不认为这会产生影响)
  3. 非常感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:2)

使用进程而不是线程会产生影响 - 无论程序是否是线程安全的,它都将起作用。当然,它是否更快取决于解决问题所花费的时间是否大于开销。

使用流程可能需要一些额外的麻烦来设置所有必要的数据。然而,multiprocessing模块负责大部分工作,因此这不应该太难。

答案 1 :(得分:-1)

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