Performance 加速计算同一组节点上的多条scipy样条曲线

Performance 加速计算同一组节点上的多条scipy样条曲线,performance,numpy,scipy,interpolation,Performance,Numpy,Scipy,Interpolation,关于在scipy(版本0.12.0)中加速样条函数计算,我有几个快速的问题,我想为我对样条函数的新手理解提前道歉。我试图创建一个对象,用于scipy.INTEGLE.odeint化学动力学问题的积分,使用样条线查找反应速率(ode系统变量的1.e2-1.e3函数),并为ode方程组中的所有代数生成c代码。与以前纯python实现相比,计算c代码要比样条插值快得多,因此样条插值的计算是ODE函数中的瓶颈。在试图消除瓶颈时,我将所有反应速率转化为样条曲线,这些样条曲线存在于相同节点值上,具有相同的顺

关于在scipy(版本0.12.0)中加速样条函数计算,我有几个快速的问题,我想为我对样条函数的新手理解提前道歉。我试图创建一个对象,用于scipy.INTEGLE.odeint化学动力学问题的积分,使用样条线查找反应速率(ode系统变量的1.e2-1.e3函数),并为ode方程组中的所有代数生成c代码。与以前纯python实现相比,计算c代码要比样条插值快得多,因此样条插值的计算是ODE函数中的瓶颈。在试图消除瓶颈时,我将所有反应速率转化为样条曲线,这些样条曲线存在于相同节点值上,具有相同的顺序,同时具有不同的平滑系数(实际上,我将有多个函数集,其中每个函数集位于相同的节点上,具有相同的参数变量,并且处于相同的导数级别,但为了简单起见,我将为这个问题假设一个函数集)

原则上,这只是相同x值上的一组曲线,可以使用interp1d(从scipy.interpolate等效地重写splmake和spleval)或SPLEP对tck数据的splev调用列表进行处理

In [1]: %paste
import numpy
import scipy
from scipy.interpolate import *
#Length of Data
num_pts = 3000
#Number of functions
num_func = 100
#Shared x list by all functions
x = numpy.linspace(0.0,100.0,num_pts)
#Separate y(x) list for each function
ylist = numpy.zeros((num_pts,num_func))
for ind in range(0,num_func):
   #Dummy test for different data
   ylist[:,ind] = (x**ind + x - 3.0)

testval = 55.0

print 'Method 1'
fs1 = [scipy.interpolate.splrep(x,ylist[:,ind],k=3) for ind in range(0,num_func)]
out1 = [scipy.interpolate.splev(testval,fs1[ind]) for ind in range(0,num_func)]
%timeit [scipy.interpolate.splev(testval,fs1[ind]) for ind in range(0,num_func)]

print 'Method 2 '
fs2 = scipy.interpolate.splmake(x,ylist,order=3)
out2 = scipy.interpolate.spleval(fs2,testval)
%timeit scipy.interpolate.spleval(fs2,testval)

## -- End pasted text --
Method 1
1000 loops, best of 3: 1.51 ms per loop
Method 2 
1000 loops, best of 3: 1.32 ms per loop
据我所知,在创建tck数组(使用splrep或splmake)后,当给定一些新值xnew时,求值函数(splev和spleval)将执行两个操作: 1) 确定结的相关标记和平滑系数 2) 使用平滑系数和新xnew计算多项式表达式

问题 由于(函数集中的)所有样条曲线都是在相同的节点值上创建的,一旦对函数集中的第一个函数执行了样条曲线计算,是否可以避免步骤(1,相关指数)?从我查看Fortran fitpack文件(直接从中,我在我的机器上找不到scipy使用的.c文件)的情况来看,我认为这是不受支持的,但我希望显示错误

就我而言,编译系统c代码以及创建所有样条tck数组是一个预处理步骤;如果我担心评估这些函数列表的速度,那么应该考虑编译变量,因为我的tck列表是不变的

我的一个函数集可能有一个几何间距值的x数组,而不是线性间距值;这会大大缩短样条曲线的计算时间吗

提前感谢您的时间和回答。 干杯
Guy

DIERCKX代码确实不支持向量值样条曲线(这是您在这里想要的);Scipy直接使用该代码,它没有移植到C。修复这一问题已在Scipy的路线图上,但不确定它是否会在下一个版本中出现。同时,您可以自己编写一个样条曲线求值例程——在Fortran中只需要50行代码,而且相当简单。请参阅DIERCKX中的splev.f和fpbspl.f。干杯,谢谢您提供的信息。我想知道scipy或fitpack库是否提供了我错过的东西,但正如您所说,编写矢量化版本应该不会太难。再次感谢。