Rav*_*avi 8 python embed fortran
我正在考虑将python嵌入fortran90的选项,以便为我现有的fortran90代码添加python功能.我知道可以通过使用来自numpy的f2py使用fortran90扩展python来反过来做到这一点.但是,我想在fortran中保留我的超级优化主循环并添加python来执行一些额外的任务/评估进一步的开发,然后才能在fortran中完成它,并且还可以简化代码维护.我正在寻找以下问题的答案:
1)是否存在已经存在的库,我可以将python嵌入到fortran中?(我知道f2py并且它反过来了)2)我们如何处理从fortran到python并返回的数据传输?3)我们如何实现回调功能?(让我稍微描述一下场景....我在Fortran中有我的main_fortran程序,在python中调用Func1_Python模块.现在,从这个Func1_Python,我想调用另一个函数...在Fortran中说Func2_Fortran)4)什么在性能方面将python的解释器嵌入到fortran中的影响......就像加载时间,运行时间,发送数据(双精度的大数组)等.
非常感谢您的帮助!
Edit1:我想通过添加一些关于我正在做的工作的更多信息来设置正确的讨论方向.我是科学计算的东西.因此,我会在双精度和浮点运算中对大型数组/矩阵进行大量工作.因此,除了fortran之外,很少有其他选择可以为我做这项工作.我想将python包含到我的代码中的原因是我可以使用NumPy在必要时进行一些基本计算,并以最小的努力扩展代码的功能.例如,我可以使用几个库来链接python和其他一些包(比如使用PyFoam库的OpenFoam).
我知道你想在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是一个相当标准的工具,因此找到可以帮助您解决任何问题的人并不难.
如果绝对必须让Fortran代码调用Python代码,而不是相反,最简单的方法是让Fortran代码将一些数据写入磁盘,并使用SYSTEM或运行Python代码EXECUTE_COMMAND_LINE.如果你使用EXECUTE_COMMAND_LINE,您可以让Python代码将其结果输出到stdout,Fortran代码可以将其作为字符数据读取; 如果你有很多输出(例如,一个大矩阵),那么Python代码输出Fortran代码然后读取的文件会更有意义.磁盘读/写开销可能会对此非常重要.此外,您必须编写Fortran代码来输出数据,使用Python代码来读取它,使用Python代码再输出它,然后使用Fortran代码重新输入数据.这段代码应该直接编写和测试,但在编辑代码时保持这四个部分同步可能会变得令人头疼.
(在此Stack Overflow问题中尝试了此方法)
我不知道直接将内存中的Python对象传递给Fortran.但是,Fortran代码可以调用C代码,而C代码可以嵌入Python代码.(请参阅有关扩展和嵌入的Python教程.)通常,扩展Python(我在第1点推荐)比将其嵌入C/C++更可取.(请参阅扩展与嵌入:只有一个正确的决定.)实现这一点将是一场噩梦,因为Python和Fortran之间的任何通信问题都可能发生在Python和C之间,或者发生在C和Fortran之间.我不知道是否有人在Fortran中实际嵌入Python,因此获得帮助将很困难.
如果你要在Fortran中嵌入Python,你必须通过Fortran的C接口来实现; 这就是ISO_C_BINDING的用途.我会警告不要嵌入Python,不是因为这样做有技术上的困难,而是因为Python(语言或社区)似乎坚决反对将Python用作从属语言.常见的观点是,您的代码当前编写的非Python语言应该被分解为库并用于扩展Python,而不是相反.所以你会看到(如此处)更多回复试图说服你,你真的不想做你真正想做的事情,而不是实际的技术援助.
这不是燃烧或编辑或做出道德判断; 这是一个简单的事实陈述.如果您尝试嵌入Python,则无法从Python社区获得帮助.
如果您需要的功能超出了Fortran语言本身所支持的功能(例如文件系统操作),并且您并不特别需要Python,并且您希望语言比C更具表现力,那么您可能需要考虑嵌入Lua.与Python不同,Lua专门用于嵌入,因此您可能面临更少的社交和技术阻力.
有许多项目整合了Fortran和Lua,我见过的最完整的项目是Aotus.作者非常敏感,整合过程很简单.
不可否认,这并没有回答原始问题(如何在Fortran 90应用程序中嵌入Python解释器),但公平地说,其他任何响应都没有.我最近使用Python作为我的便携式通用语言,在扩展我们的主要产品(用Fortran编写)时,我更愿意坚持使用它.由于上面提到的原因,我放弃了嵌入Python并尝试嵌入Lua的尝试; 出于社会原因,我觉得Lua是一个更好的技术选择.这不是我的第一选择,但它是可行的,至少在我的情况下.
如果我冒犯了任何人,我会道歉; 我不打算挑选一场战斗,只是在研究这个特定主题时提到我的经验.
小智 5
有一种非常简单的方法可以使用f2py. 编写您的 python 方法并将其添加为 Fortran 子例程的输入。cf2py在钩子和类型声明中将其声明EXTERNAL为其返回值类型,例如REAL*8。然后,您的 Fortran 代码将有一个指向存储 python 方法的地址的指针。它会像糖蜜一样慢,但对于测试算法来说它可能很有用。我经常这样做(我将很多古老的意大利面条 Fortran 移植到 python 模块......)这也是在旧版 Fortran 中使用优化的 Scipy 调用等功能的好方法
小智 5
我开发了Forpy允许您在Fortran中使用Python(嵌入)的库。它使用Fortran C互操作性来调用Python C API函数。
虽然我同意扩展(在Python中使用Fortran)通常更可取,但是嵌入有其用途:
除了嵌入之外,Forpy还支持扩展Python。这样Forpy您就可以完全在Fortran中编写Python扩展模块。现有工具的一个优点f2py是,例如,您可以使用Python数据类型(例如,编写将Python列表作为参数的函数或返回Python dict的函数)。
使用现有的(可能是遗留的)Fortran代码通常非常困难,我认为开发人员应该拥有可用于嵌入和扩展Python的工具。
| 归档时间: |
|
| 查看次数: |
6332 次 |
| 最近记录: |