Python 对scipy矩形双变量样条线调用的并行化

Python 对scipy矩形双变量样条线调用的并行化,python,multithreading,numpy,parallel-processing,scipy,Python,Multithreading,Numpy,Parallel Processing,Scipy,我正在编写一个python代码,需要在任意一组点上多次计算2D样条曲线。代码如下所示: spline=scipy.interpolate.RectBivariateSpline(…) 对于范围内的i(1000000): x_点,y_点=数据。获取_输出_点(i) VAL=样条曲线.ev(x_点,y_点) “使用VAL进行操作” 输出点之间没有重叠。我想使用线程或某种共享内存来并行处理这个问题,因为数据。get\u output\u points使用了大量内存。天真地,我尝试生成10个线程,并给

我正在编写一个python代码,需要在任意一组点上多次计算2D样条曲线。代码如下所示:

spline=scipy.interpolate.RectBivariateSpline(…)
对于范围内的i(1000000):
x_点,y_点=数据。获取_输出_点(i)
VAL=样条曲线.ev(x_点,y_点)
“使用VAL进行操作”
输出点之间没有重叠。我想使用线程或某种共享内存来并行处理这个问题,因为
数据。get\u output\u points
使用了大量内存。天真地,我尝试生成10个线程,并给它们每个1/10的循环。然而,这并没有给我任何速度超过运行一个线程

我分析了代码,它将所有时间都花在
fitpack2.py:674(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。看起来我遇到了一些GIL问题,它阻止了线程独立运行

我如何绕过GIL问题并将其并行化?有没有办法调用能很好地并行化的
fitpack
例程,或者我可以使用不同的样条曲线?我的输入网格是统一的和过采样的,但我的输出点可以在任何地方。我尝试过使用
RegularGridInterpolator
(线性插值),它的性能足够好,虽然不理想,但使用线程时并行性很差

编辑:以下是我所说的朴素线程并行化的意思:

def辅助程序(开始、结束): 对于范围内的i(开始、结束): x_点,y_点=数据。获取_输出_点(i) VAL=样条曲线.ev(x_点,y_点) “使用VAL进行操作” t1=threading.Thread(target=worker,args=(0,500000)).start() t2=threading.Thread(target=worker,args=(5000011000000)).start() t1.join() t2.join()
在python中有多种并行处理方法,可以避免GIL:

查看更多信息


是的,你是击中了吉尔瓶颈。

你能告诉我们你是如何并行化代码的吗?当然,我添加了一个例子。我只是把for循环分成不同的线程。是的,你说得对。我对此进行了更多的研究,dfitpack代码从未禁用GIL,因此不可能实现我希望用线程实现的功能。我不知道为什么在进入fortran代码时它会保留GIL,但可能只是因为没有人花时间去弄清楚什么可以禁用GIL,什么不能禁用。我将重新构造一切,以使用多处理。