我可以用f2py创建一个类吗?

时间:2015-01-14 15:08:22

标签: python class fortran f2py

我想使用f2py来生成一个行为类似于python类的对象:它应该存储一段数据,这样数据只需要传递一次。我最终希望得到如下的python代码,其中myfortranmodule是使用f2py编译的模块。

from myfortranmodule import Analyzer

analyzer = Analyzer(bigvector)
for parameter in [0.0, 8.3, 10.2, ...]:
    answer = analyzer.get_answer(parameter)

具体来说,我需要以这种方式构造它,因为bigvector是一个非常大的数据,只应传递一次,fo​​r循环中的参数列表很长(并且可以' t提前传递,因为它是在python中即时生成的),而get_answer方法是计算密集型的,所以应该在fortran中完成。

是否可以使用f2py构建类似类的对象,或以其他方式将数据存储在fortran子例程中?

2 个答案:

答案 0 :(得分:1)

这只是为了确认使用公共块将满足您的需要。实际上,从相反的角度来看,我偶然发现了这一点;当我想要一个干净的方法调用时,我正在获得数据持久性! 由于Fortran例程很长,我通过启动multiprocessing.process从那里调用Fortran模块然后join每次我想运行它来解决问题。这比重写Fortran以删除公共块更简单。

q = mp.Queue()
cargs = (arg1, arg2, arg3)
p = mp.Process(target=module, args=(q, cargs))
p.start()
p.join()
result = q.get()

答案 1 :(得分:0)

我会对我的问题发表一个不完美的答案,因为我现在有一个合理的解决方案用于我的目的。我找到的解决方法是使用"公共块"在f2py中,它允许从python直接访问fortran子例程中的指定变量。 (请注意,这不会给出 true 类类行为,因为我无法实例化与唯一数据值同时存在的多个类 - 但它仅用于传递最大量数据的目的。)

下面是一个简短的例子。下面是示例fortran代码。

C file: common.f

      subroutine add(input, output)
          integer input,output,saved
          COMMON /DATA/ saved
cf2py     intent(in) :: input
cf2py     intent(out) :: output
          output = saved + input
      end

C end of common.f

这是用

编译的
f2py -c -m common common.f

然后在python中我可以直接访问和修改common.data.saved中的值,当我调用子例程common.add时,它返回传递和存储值的总和。因此,"存储"价值只需按照原始职位的要求传递一次。

>>> import common
>>> common.data.saved = 10
>>> common.add(1)
11
>>> common.add(100)
110

f2py Users Guide and Reference Manual

中有更详细的描述