【问题标题】:Fortran or C and f2py to solve differential equationsFortran 或 C 和 f2py 求解微分方程
【发布时间】:2015-11-29 22:00:00
【问题描述】:

这更像是一个设计问题。我参与了一个项目,该项目需要我们求解一堆一阶微分方程。我知道 python 有这方面的模块,我们一直在使用这些功能。

但是,我们需要快速的积分器,因此我们希望使用自适应步长并测试 scipy 包中未包含的其他一些例程。为此,我有一个 f2py 问题,因为用 fortran 或 C 编写 ODE 求解器并使用 f2py 包装它似乎很有意义。例如,在 fortran 和 python 之间的接口中,“减速”发生在哪里?是在来回传输记忆吗?我想知道我需要在前端考虑什么。当然,我可以直接用python写(对于初学者),但是我听说在python中循环很慢。

无论如何,只是寻找一般建议和要考虑的事情。

谢谢。

【问题讨论】:

  • 你可以用C(或fortran)编写整个东西——Runge Kutta 4th order 是一种流行的方法,编程有点繁琐,但效果很好。商业软件包将是 Comsol。

标签: python c scipy fortran f2py


【解决方案1】:

我不熟悉 f2py,但您是否考虑过先尝试Cython?如果您不熟悉它,它可以让您使用标准 Python 语言的超集编写代码,然后将其转换为 C 代码,然后编译。如果您的代码主要是循环,这可能会加快它的速度。但请记住,任何时候您从 Cython(或从常规 C 代码,就此而言)调用纯 Python 函数时,都会产生瓶颈。 (我相信这就是你所说的减速。)

话虽如此,我最近扔掉了一个我编写的 Cython 模块,并将其替换为使用 Python/C API 的手写 C++ 库。这更好,因为它让我可以更好地控制 C++ 代码与 NumPy 的交互,这对 Cython 来说有点挑战。

【讨论】:

  • 您的 C++ 库是否可供在线调查,还是用于个人/私人项目?
  • @cbcoutinho 具有讽刺意味的是,自从我发布这个答案后,我又回到了使用 Cython,因为使用 Python API 的 C++ 库太难维护了。所以不,抱歉,该代码不再容易获得。但是,Cython 文档介绍了如何从 Cython 代码调用 C 库,这是我现在所做的,所以我建议您看一下。
  • 感谢您这么快回复我@jb326,我得出了与您类似的结论——即使我正在使用 Fortran 库而不是基于 C 的库的额外好处一。到目前为止,我已经检查了 ctypes、cython 和 CFFI。从 Fortran 的角度来看,我发现 cython 和 cffi 有点难以理解,因为一切都是以 C 为中心的 w.r.t。 c 数据结构、指针等。现在我正在使用 ctypes 和 numpy,但由于我缺乏 C 语言背景,它仍然感觉很笨拙且容易出错。
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 2013-10-11
  • 2021-04-19
相关资源
最近更新 更多