我想使用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
是一个非常大的数据,只应传递一次,for循环中的参数列表很长(并且可以' t提前传递,因为它是在python中即时生成的),而get_answer
方法是计算密集型的,所以应该在fortran中完成。
是否可以使用f2py
构建类似类的对象,或以其他方式将数据存储在fortran子例程中?
答案 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
中有更详细的描述