- 积分
- 4824
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-8-9
- 最后登录
- 1970-1-1
|
发表于 2014-10-30 22:03:11
|
显示全部楼层
作为前段时间经常用f2py的人,我来说下感受。
1、我在我的Win7 64位下跑步起来f2py,查了下发现时EPD python的一个bug,尝试了多种方法,包括安装gfortran等等都无法解决。所以建议想要使用f2py的同学转移到linux环境下。 当然你在win下面能用起来当我没说。
2、f2py对fortran程序的编译也是按照你的fortran编译器来的,所以会有一些细微的区别。常见的比如intel编译器好通过、gfortran编译不好通过的问题也会出现(一般都是一些格式问题,其实没什么太大影响,改改就好了)
2、编译的时候是可以选择编译器的,在f2py命令里面加入compiler信息就可以实现,详情可以看看手册,有详细介绍。但是需要注意的是,f2py好像还不支持pgi编译器!
3、需要注意的是,在进行调用的时候,intent(in)的变量里,跟维数有关的变量必须放置在最后。比如我的函数命名为:f(a,b,c,d,n)这里面a、b、c、d都是普通的变量或数组之类的,但是n必须是一个跟维数有关的变量,用来在fortran程序里定义数组时使用。
4、上面这条里所说的跟维数有关的变量必须放在最后,适用于n也是一个用来传递的变量的情况下。即是说你在使用时希望将维数信息用变量n来进行传递时,那么就得把它放在最后。再换句话说,n就是intent(in)的情况。
5、intent(out)的变量(注意这里限定为out,如果是inout类型的我没试过)可以放在任意位置,也不影响。(就是说不受上面那个跟纬度有关的变量的约束)(另外intent (out)的变量也需要出现在fortran的 subroutine 那一行)
比如在python里使用一个f2py设置好的函数时:
import f(a,b,c,d,n)
x=f(a,b,c,d,n)
就可以了,而这个函数在对应的fortran程序里面的定义需要这样:
subroutine f(a,b,c,d,n,x)
integer::a,b,c,n
integer,dimension(n)::d,x
!f2py intent(in)::a,b,c,d,n
!f2py intent(out)::x
x=(a*b-c)*d
return
end subrountine
如此。
6、一般在使用fortran的时候需要注意二维数组的行列关系的问题,即是说fortran里面的数组是(列,行)这样,而python里面是(行,列),不过貌似利用f2py进行传递时,不需要管这个,直接用就行。
7、f2py可以实现module的调用、子程序等等一些列fortran的功能。
说下使用体验。 f2py极大的提高了python的运算效率。我拿这个来写了个小模式来跑,真的是非常快。再加上python的绘图功能和简洁的语言结构,可以说是极大的改进了编程体验。Jonny Lin就用f2py做了个python版的qtcm模式,可以谷歌到。
一言概之,就是如虎添翼吧
|
评分
-
查看全部评分
|