我有一个数值程序需要运行来解决某个包含几个嵌套循环的方程。最初我用Python编写了这个程序,并使用numba.jit来实现可接受的性能。然而对于大型系统,这种方法变得相当慢,因此我一直在重写程序,希望用Fortran实现加速。但是,我发现Fortran版本比Python第一版慢得多,约为2-3倍。
我相信瓶颈在于每个最内层循环中调用的线性插值函数。在Python实现中,我使用numpy.interp,在与numba.jit结合使用时似乎非常快。在Fortran中,我编写了自己的插值函数,其代码如下:
请注意,我需要插值复杂数据。如果我的诊断正确,这个函数比
有没有人知道如何在Fortran中实现类似Numpy的插值速度?或者,如果我上面展示的插值函数效率极低,该怎么办呢?我对Fortran的编程经验不是很丰富。
谢谢!
我相信瓶颈在于每个最内层循环中调用的线性插值函数。在Python实现中,我使用numpy.interp,在与numba.jit结合使用时似乎非常快。在Fortran中,我编写了自己的插值函数,其代码如下:
complex*16 function interp(x_dat, y_dat, N_dat, x)
implicit none
integer, intent(in) :: N_dat
real*8, dimension(N_dat), intent(in) :: x_dat
complex*16, dimension(N_dat), intent(in) :: y_dat
real*8, intent(in) :: x
complex*16 :: y, y1, y2
integer :: i, i1, i2, im
if(x <= x_dat(1)) then
y = y_dat(1)
else if(x >= x_dat(N_dat)) then
y = y_dat(N_dat)
else
im = MINLOC(DABS(x_dat - x), DIM=1)
if(x_dat(im) >=x ) then
i1 = im
i2 = im - 1
else
i1 = im + 1
i2 = im
end if
y1 = y_dat(i1)
y2 = y_dat(i2)
y = y1 + (x-x_dat(i1))*(y2 - y1)/(x_dat(i2) - x_dat(i1))
end if
interp = y
return
end function interp
请注意,我需要插值复杂数据。如果我的诊断正确,这个函数比
numpy.interp
慢得多,因为每次循环都必须调用插值函数,从而大大降低了整个程序的速度。有没有人知道如何在Fortran中实现类似Numpy的插值速度?或者,如果我上面展示的插值函数效率极低,该怎么办呢?我对Fortran的编程经验不是很丰富。
谢谢!