最近在学习 Python 调用 Fortran,期间碰到一个很费解的问题,具体如下:
1,Fortran 编写了一个三重循环,前两个循环是在循环一个二维数组,第三场循环是每个二维数组的点会循环一个数量为 5000 的离散点,并计算其与离散点的距离,当距离小于一定阈值时,加 1,具体代码如下:
do i=1,1401
do j=1,1201
glat=(j-1)*0.1
glon=(i-1)*0.1
do ll=1,5000
distance=sqrt((glat-lat(ll))**2+(glon-lon(ll))**2)
if ( distance<= 2.5 ) then
grid_nst(j,i)=grid_nst(j,i)+1
endif
enddo
enddo
enddo
这个如果用 Fortran 编译器编译并直接运行,时间为 13-15s 不等
2,同一个循环,写成一个 subroutine,然后用 f2py 编译,并用 Python 调用,时间却长达 40-50s 不等,代码未做任何改变,因此只给出传参的代码下:
Fortran:subroutine test(nst,lat,lon)
Python:var=loop.test(lat,lon)
编译命令:f2py -c tt.f90 -m loop --f90exec=gfortran
同一个循环程序,两种运行方式用时差别如此之大,真的让人想不通,不知有没有懂这两种语言并这么使用过的同志知道原因,谢谢
1,Fortran 编写了一个三重循环,前两个循环是在循环一个二维数组,第三场循环是每个二维数组的点会循环一个数量为 5000 的离散点,并计算其与离散点的距离,当距离小于一定阈值时,加 1,具体代码如下:
do i=1,1401
do j=1,1201
glat=(j-1)*0.1
glon=(i-1)*0.1
do ll=1,5000
distance=sqrt((glat-lat(ll))**2+(glon-lon(ll))**2)
if ( distance<= 2.5 ) then
grid_nst(j,i)=grid_nst(j,i)+1
endif
enddo
enddo
enddo
这个如果用 Fortran 编译器编译并直接运行,时间为 13-15s 不等
2,同一个循环,写成一个 subroutine,然后用 f2py 编译,并用 Python 调用,时间却长达 40-50s 不等,代码未做任何改变,因此只给出传参的代码下:
Fortran:subroutine test(nst,lat,lon)
Python:var=loop.test(lat,lon)
编译命令:f2py -c tt.f90 -m loop --f90exec=gfortran
同一个循环程序,两种运行方式用时差别如此之大,真的让人想不通,不知有没有懂这两种语言并这么使用过的同志知道原因,谢谢