我能用f2py创建一个类吗?

2024-10-04 05:28:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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循环中的参数列表很长(不能提前传递,因为它是在python中动态生成的),而且get_answer方法计算量很大,所以应该在fortran中完成。在

有没有可能用f2py来构建类似类的对象,或者在fortran子例程中存储数据?在


Tags: 模块数据对象代码answerfromforget
2条回答

我将对我的问题给出一个不完美的答案,因为我现在有了一个合理的解决方案。我找到的解决方法是在f2py中使用“公共块”,它允许从python直接访问fortran子例程中指定的变量。对于这个类来说,一次传递多个类的唯一值是不可能的

下面是一个简短的例子。下面是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

这是用

^{pr2}$

然后在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中有更详细的描述。在

这只是为了确认使用公共块可以满足您的需要。实际上,我从相反的角度偶然发现了这一点;当我想要一个干净的方法调用时,我正在获取数据持久性! 由于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()

相关问题 更多 >