专栏首页气象杂货铺f2py:连接 FORTRAN 和 Python 的桥梁

f2py:连接 FORTRAN 和 Python 的桥梁

如果说 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 编译器:

python.exe f2py.py -c --help-fcompiler

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

执行后将得到以下结果:

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

查看支持的 c 编译器选项

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 下使用要简单很多,不再赘述。

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

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下直接运行以下语句即可

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/

本文分享自微信公众号 - 气象杂货铺(meteogs),作者:lightning

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用CDO查看气象数据信息

    CDO提供了一系列查看数据集信息的命令,可以非常方便的查看数据集信息,而不用想使用python,ncl,matlab等编程语言或软件一样,先读文件,然后再获取相...

    bugsuse
  • 一个脚本下载风云卫星数据所有订单

    尽管用户也可以使用DownThemAll[1]进行批量下载,但不适合直接在服务器上操作。

    bugsuse
  • 绘图系列(1):利用matplotlib绘制等值线图

    绘图系列是为了给出一些图形绘制示例,便于快速绘制一些图形。此系列不受所用语言和工具的限制,可能会使用 python,matlab,ncl,idl以及其它一些语言...

    bugsuse
  • 最多因子数(DFS+数论+剪枝)- CodeVS 1032

    数学家们喜欢各种类型的有奇怪特性的数。例如,他们认为945是一个有趣的数,因为它是第一个所有约数之和大于本身的奇数。

    ACM算法日常
  • 20 分钟教你搞懂 Git!

    尽管每天你都会用到Git,但也有可能搞不懂它的工作原理。为什么Git可以管理版本?基本命令git add和git commit到底在干什么?

    昱良
  • R in action读书笔记(9)-第八章:回归 -回归诊断

    口正态性当预测变量值固定时,因变量成正态分布,则残差值也应该是一个均值为0的正态分布。正态Q-Q图(Normal Q-Q,右上)是在正态分布对应的值下,标准化残...

    统计学家
  • tslint pre-commit 配置教程

    版权声明:本文为博主原创文章,未经博主允许不得转载。 ...

    j_bleach
  • php - tcp 粘包/拆包实例

    tcp 长链接模式下,使用固定消息头长度的方式进行消息 拆包 ,解决 粘包 问题。

    猿哥
  • git 一些undo操作

    使用git的时候经常会出现,“啊!,刚才提交的代码有问题,需要undo一下了” 这种情况,为了应对这种问题。本文介绍 git 的一些 undo 操作

    ke1th
  • 基于 Asp.Net的 Comet 技术解析

    Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询...

    用户1105954

扫码关注云+社区

领取腾讯云代金券