将python嵌入fortran 90

将python嵌入fortran 90,python,fortran,embed,Python,Fortran,Embed,我正在考虑将python嵌入fortran90的选项,以便将python功能添加到我现有的fortran90代码中。我知道,通过使用numpy中的f2py使用fortran90扩展python,可以实现相反的目的。但是,我想在fortran中保留我的超级优化主循环,并添加python来执行一些额外的任务/评估进一步的开发,然后才能在fortran中执行,同时也可以简化代码维护。我正在寻找以下问题的答案: 1) 是否有一个已经存在的库,我可以从中将python嵌入fortran?(我知道f2py,

我正在考虑将python嵌入fortran90的选项,以便将python功能添加到我现有的fortran90代码中。我知道,通过使用numpy中的f2py使用fortran90扩展python,可以实现相反的目的。但是,我想在fortran中保留我的超级优化主循环,并添加python来执行一些额外的任务/评估进一步的开发,然后才能在fortran中执行,同时也可以简化代码维护。我正在寻找以下问题的答案:

1) 是否有一个已经存在的库,我可以从中将python嵌入fortran?(我知道f2py,但它的作用正好相反) 2) 我们如何处理从fortran到python的数据传输? 3) 我们如何实现回拨功能?(让我稍微描述一下这个场景……我用fortran编写了我的主程序,用Python调用Func1_Python模块。现在,从这个Func1_Python,我想调用另一个函数……比如用fortran调用Func2_fortran) 4) 在fortran中嵌入python解释器会对性能产生什么影响…比如加载时间、运行时间、发送数据(一个双精度的大数组)等等

非常感谢您的帮助

编辑1:我想通过添加更多关于我正在做的工作的信息来确定讨论的方向。我喜欢科学计算。所以,我会在双精度的大型数组/矩阵上做很多工作,并做浮点运算。因此,除了fortran之外,只有很少的选项可以真正为我完成这项工作。我希望在代码中包含python的原因是,如果需要,我可以使用NumPy进行一些基本计算,并以最小的工作量扩展代码的功能。例如,我可以使用几个库来链接python和其他一些包(比如使用PyFoam库的OpenFoam)。

1。不要这样做 我知道您希望在Fortan程序中添加Python代码,而不是使用带有Fortran扩展的Python程序。我的第一条建议是不要这样做。Fortran在数组运算方面比Python快,但Python比Fortran更容易编写,用OOP技术扩展Python代码更容易,Python可能可以访问对您很重要的库。您提到在Fortran中有一个超级优化的主循环;Fortran非常适合于超级优化的内部循环。使用Numpy在Python程序中传递Fortran数组的逻辑要比在Fortran中正确处理Python对象所需的逻辑简单得多

当我从头开始一个科学计算项目时,我总是先用Python编写,找出性能瓶颈,然后将它们转换成Fortran。能够用验证过的Python代码测试更快的Fortran代码,可以更容易地证明代码工作正常

由于您有现有的代码,因此使用Fortran中的模块扩展Python代码将需要重构,但这个过程应该很简单。将初始化代码与主循环分开,将循环分解为逻辑部分,将这些例程包装在Python函数中,然后主Python代码可以调用Fortran子例程,并根据需要将它们与Python函数交错。在这个过程中,您可以在Fortran中保留主循环中的许多优化。F2PY是一个合理的标准工具,因此不难找到能够帮助您解决任何问题的人

2.系统调用 如果您必须让Fortran代码调用Python代码,而不是相反,那么最简单的方法就是让Fortran代码将一些数据写入磁盘,然后使用
系统
执行命令行
运行Python代码。如果使用
EXECUTE\u命令行
,可以让Python代码将其结果输出到标准输出,Fortran代码可以将其作为字符数据读取;如果您有很多输出(例如,一个大矩阵),那么Python代码输出一个Fortran代码读取的文件会更有意义。因此,磁盘读/写开销可能非常大。此外,还必须编写Fortran代码来输出数据,编写Python代码来读取数据,编写Python代码来再次输出数据,编写Fortran代码来重新输入数据。这段代码的编写和测试应该很简单,但是在编辑代码时保持这四个部分的同步可能会让人头疼

(这一方法已在中国试用)

3.用Fortran语言在C语言中嵌入Python
据我所知,没有办法将内存中的Python对象直接传递给Fortran。然而,Fortran代码可以调用C代码,C代码中可以嵌入Python。(请参阅。)一般来说,扩展Python(如我在第1点中建议的)比将其嵌入C/C++更可取。(请参阅。)使其正常工作将是一场噩梦,因为Python和Fortran之间的任何通信问题都可能发生在Python和C之间,或者C和Fortran之间。我不知道是否有人真的将Python嵌入Fortran中的C语言中,因此很难获得帮助。

我已经尝试了几种方法来解决这个问题,并且找到了一种可能的最佳方法。我将简要列出这些方法和结果

1) 通过系统调用嵌入:每当我们想从fortran访问python时,我们都会使用系统调用来执行一些python脚本并在它们之间交换数据。这种方法的速度受到磁盘读写的限制(在这个代码缓存级别优化的时代,进入磁盘是一种致命的罪恶)。此外,我们需要在每次执行脚本时初始化解释器,这是一个相当大的开销。一个简单的Runge-Kutta四阶方法运行了300个时间步,执行时间高达59秒

2) 通过C从Fortran到Python:我们使用ISO_C绑定