对scipy RectBivariateSplin调用的并行化

2024-04-26 04:59:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

spline = scipy.interpolate.RectBivariateSpline(...)
for i in range(1000000):
    x_points, y_points = data.get_output_points(i)
    vals = spline.ev(x_points, y_points)
    """ do stuff with vals """

输出点没有重叠。由于data.get_output_points使用了大量内存,所以我想使用线程或某种共享内存来并行化它。天真地,我尝试生成10个线程,并给它们每个循环的1/10。但是,这并没有给我任何速度超过运行一个线程。在

我分析了代码,它将所有的时间花在fitpack2.py:674(\__call__),这是_BivariateSplineBase求值函数。似乎我遇到了一些GIL问题,这会妨碍线程独立运行。在

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

编辑:我所说的天真线程并行化是什么意思:

^{pr2}$

Tags: 函数代码outputdatagetscipy线程曲线