前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >f2py:连接 FORTRAN 和 Python 的桥梁

f2py:连接 FORTRAN 和 Python 的桥梁

作者头像
bugsuse
发布2020-04-21 17:44:16
4.6K0
发布2020-04-21 17:44:16
举报
文章被收录于专栏:气象杂货铺气象杂货铺

如果说 Python 能够让你就此起飞的话,那么使用 f2py 能让你在一定程度上飞的更高更远。

f2py 是用来连接 fortran 和 python 的 python 包,可以将 fortran 源程序转换为 python 可用的程序(windows下转换为*.pyd格式文件,linux下转换为*.so文件)。编译好后,使用时直接在python中导入即可。f2py 是 numpy 的一部分,当你安装了 numpy 时就已经包含 f2py 了,其可以被用来构建 Python C/API 扩展模块,从而更容易调用 FORTRAN77/90/95 子程序,FORTRAN77 common 数据块 或 FORTRAN90/95 module 模块。

将 fortran 程序转换为 python 可用的程序是非常必要的,尤其是在进行复杂数值计算和处理大量数据时,调用 fortran 程序比使用 python 要高效的多。更为重要的是,如果已经有了 fortran 程序,可以省下很多编写相应的 python 程序的时间。

下图分别是 python 版网格化程序(35行)和 fortran版程序(36行)的执行时间:

使用纯python 程序实现耗时 11.7 s,而使用 fortran 实现的程序耗时不到 1 ms,差距非常明显。而且上述使用的数据样本很少,当数据量变大时,两者之间的差异将更加明显。

关于其优点不再多说,安装部分不再赘述,主要说一下如何使用

Windows

如果直接使用 f2py 进行程序的转换,很可能会出现问题。当然,如果你已经配置好环境了的话是没问题的。

由于 f2py 的使用需要用到 c/c++ 编译器,fortran 编译器,因此,在使用之前要安装相应的编译器。

安装之前可以执行以下语句查看是否已经包含 fortran 编译器:

代码语言:javascript
复制
python.exe f2py.py -c --help-fcompiler

注意:切换到 python 所在目录下执行,或者指定完整路径。如果安装到了 Program Files (x86) 目录下,即使指定完整路径也会失败,因为路径中包含了空格。

执行后将得到以下结果:

红色框 表示当前系统中安装的 fortran 编译器,浅蓝色框 表示 f2py 支持的 fortran 编译器,又分为当前系统可用不可用的部分,黄色圆 以下表示当前系统不可用的 fortran 编译器。

查看支持的 c 编译器选项

代码语言:javascript
复制
python.exe f2py.py -c --help-compiler

如果使用 vc 的话,指定编译器为 msvc, 当然也可以使用 mingw32。

本文主要使用的 fortran 编译器是 gfortran, c 编译器选项是 mingw32 和 msvc,建议使用mingw32。

需要安装 MinGW [注1] 和 VC,文中编译时使用的是 VC2012。当然可以只安装mingw。

:目前gfortran对python3.5及以上的版本支持并不好,在使用3.x以上版本进行编译时,只有3.4.版本能够编译成功,使用3.5版本编译时失败。

Linux

Linux 系统下只要安装了 python 和 numpy,并设置好了环境变量,可以直接使用,比在 windows 下使用要简单很多,不再赘述。

下面是统计每个网格发生的闪电次数的程序:

代码语言:javascript
复制
subroutine gridize(lon_num, lat_num, lonse, latse, longi_size, longi, latit, step, flash)
    implicit none
    
    integer :: lon_num, lat_num
    integer :: longi_size
    real*8 :: lonse(lon_num), latse(lat_num)
    real*8 :: longi(longi_size)
    real*8 :: latit(longi_size)
    real*8 :: step
    integer, dimension(lon_num, lat_num) :: flash
    integer :: i, j, k
    
!F2PY intent(in) :: lonse
!F2PY intent(in) :: latse
!F2PY intent(in) :: longi
!F2PY intent(in) :: latit
!F2PY intent(in) :: step
!F2PY intent(out) :: flash
    
    flash = 0
    
    do j = 1, lat_num - 1
        do i = 1, lon_num - 1
            do k = 1, longi_size 
                if ((latse(j) .le. latit(k) .and. latit(k) .lt. latse(j) + step) & 
                .and. (lonse(i) .le. longi(k) .and. longi(k) .lt. lonse(i) + step)) then
                    flash(i, j) = flash(i, j) + 1
                end if
            end do
        end do    
    end do
    
end subroutine

编译

安装好依赖后就可以使用了

在linux下直接运行以下语句即可

代码语言:javascript
复制
f2py -m gridize -m gridize.f90

也可以通过--fcompiler 和 --compiler 来指定编译器。

当然在编写可转换的 fortran 程序时很容易出错,下一次讲一下常见错误,以及如何看错误并解决之。


注1:https://sourceforge.net/projects/mingw-w64/

注2:https://www.scivision.co/f2py-running-fortran-code-in-python-on-windows/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档