Python 与 FORTRAN

计算科学 Python 正则
2021-12-12 21:36:24

哪个更好:FORTRAN 还是 Python?而且我想在这两种情况下你都需要 Gnuplot,对吗?

我目前正在使用 Windows 机器。

我想用它来获得物理问题的数值解,包括蒙特卡罗模拟、数值积分和微分、分子动力学等。

我看过一门计算物理课程,它介绍了 FORTRAN(我相信是 77)和 Python。我打算从一个开始,然后学习另一个,但我不知道哪种过渡可能是最简单的。

另外,您会推荐哪些编译器?

对我来说,基本问题归结为:哪个最容易学习,哪个最快,哪个最用户友好,最重要的是哪个最常用(所以比较这 4 个)?其次,最常用的(免费或付费)编译器有哪些?我目前正在考虑将旧笔记本电脑(早期的英特尔双核)转换为 Linux;希望这足够快。

非常感谢到目前为止的答案!与我正在寻找的答案是 LKlevin 和 SAAD 的答案。

我知道 C++、Maple 的基础知识,如果有帮助的话,我几乎完全掌握了 MATLAB 和 Mathematica9。

4个回答

易于学习

Python 和 Fortran 都是相对容易学习的语言。找到好的 Python 学习材料可能比好的 Fortran 学习材料更容易,因为 Python 的使用更广泛,而 Fortran 目前被认为是数值计算的“专业”语言。

我相信从 Python 到 Fortran 的过渡会更容易。Python 是一种解释型语言,因此运行第一个程序所需的步骤数(打开解释器,print("Hello, world!")在提示符处键入)比 Fortran (编写“Hello world”程序,编译,运行)要少。我还认为在 Python 中教授面向对象风格的材料比在 Fortran 中更好,而且 GitHub 上的 Python 代码比 Fortran 代码更多。

在 Windows 上启动和运行

安装 Python 应该不会那么痛苦;有可用的 Windows 发行版。我建议使用像 Anaconda 或 Enthought Canopy 这样的科学分布。本身并没有真正的编译器。口译员扮演这个角色。您将希望使用基于 CPython 的解释器,因为有更多可用的数字库,并且它可以与 C、C++ 和 Fortran 很好地互操作。其他解释器实现包括 Jython 和 PyPy。

在 Windows 机器上,安装 Fortran 编译器会很烦人。典型的命令行编译器是 gfortran、ifort(来自 Intel;供个人免费使用,否则要花钱)和 pgfortran(来自 PGI;免费试用版,否则要花钱)之类的程序。要安装这些编译器,您可能需要安装某种 UNIX/POSIX 类型的兼容层,例如 Cygwin 或 MinGW。我发现与它一起工作很痛苦,但有些人喜欢这种工作流程。您还可以安装带有 GUI 的编译器,例如 Visual Fortran(同样,您必须为许可证付费)。Windows Subsystem for Linux (WSL) 也可用于在 Windows 中安装 gfortran 编译器。

在 Linux 上,安装 Python 和编译器会更容易;我仍然会安装 Anaconda 或 Enthought Canopy 作为 Python 发行版。

速度:生产力与性能的权衡

在使用 Python(或 MATLAB、Mathematica、Maple 或任何解释型语言)时,您会为了生产力而放弃性能。与 Fortran(或 C++、C 或任何其他编译语言)相比,您将编写更少的代码行来完成相同的任务,这通常意味着您将花费更少的时间来获得有效的解决方案。

使用 Python 的有效性能损失各不相同,并通过将计算密集型任务委托给编译语言来减轻。MATLAB 做了类似的事情。当您在 MATLAB 中进行矩阵乘法时,它会调用 BLAS;性能损失几乎为零,您无需编写任何 Fortran、C 或 C++ 即可获得高性能。Python中也存在类似的情况。如果您可以使用库(例如,NumPy、SciPy、petsc4py、来自 FEniCS 的 dolfin、PyClaw),您可以用 Python 编写所有代码并获得良好的性能(可能会损失 10-40%),因为所有的计算密集部分是对快速编译语言库的调用。但是,如果你用纯 Python 编写所有东西,性能损失将是 100-1000 倍。所以如果你想使用 Python 并且必须包含一个自定义,计算密集型例程,您最好用 C、C++ 或 Fortran 等编译语言编写该部分,然后用 Python 接口包装它。有一些库可以促进这个过程(如 Cython 和 f2py),以及可以帮助您的教程;它通常并不繁重。

使用范围

Python 作为一种通用语言被更广泛地使用。Fortran 在很大程度上仅限于数值和科学计算,并且主要与 C 和 C++ 竞争该领域的用户。

在计算科学中,由于我提到的性能损失,Python 通常不会直接与编译语言竞争。在需要高生产力和性能是次要考虑因素的情况下,您可以使用 Python,例如在数字密集型算法的原型设计、数据处理和可视化中。当您对自己的算法和应用程序设计应该是什么有很好的了解时,您会使用 Fortran(或其他编译语言),愿意花更多时间编写和调试代码,并且性能是最重要的。(例如,性能是您模拟过程中的一个限制步骤,或者它是您研究中的关键交付物。)一个常见的策略是混合 Python 和编译语言(通常是 C 或 C++,但也使用了 Fortran),并且只对代码中对性能最敏感的部分使用编译语言;当然,开发成本是用两种语言编写和调试程序比用单一语言编写和调试程序更难。

在并行性方面,当前的 MPI 标准 (MPI-3) 具有原生 Fortran 和 C 绑定。MPI-2 标准具有本地 C++ 绑定,但 MPI-3 没有,您必须使用 C 绑定。存在第三方 MPI 绑定,例如 mpi4py。我用过 mpi4py;它运行良好,并且易于使用。对于大规模并行(数万个内核),您可能希望使用编译语言,因为如果您以幼稚的方式进行动态加载 Python 模块之类的操作,将会大规模地咬您一口。正如 PyClaw 开发人员所展示的那样,有一些方法可以绕过这个瓶颈,但避免它更简单。

个人意见

我在 Fortran 90/95 方面有大约十年的经验,并且我还在 Fortran 2003 中进行过编程。我在 Python 方面有大约五年的编程经验。我使用 Python 比使用 Fortran 多得多,因为坦率地说,我在 Python 中做得更多。我需要做的大部分工作不需要大量的超级计算资源,通常不值得用另一种语言重新开发,所以 Python 可以很好地解决 ODE 和 PDE。如果我需要使用编译语言,我将按顺序使用 C、C++ 或 Fortran。

我见过的大多数 Fortran 代码都很丑陋,主要是因为大多数计算科学界似乎不知道或反对软件工程师在过去 30 年中发现的任何最佳实践。也就是说:Fortran 中没有好的单元测试框架。(我遇到的最好的是 FUnit,由 NASA 出品,现在不再维护。)有一些好的 Python 单元测试框架、好的 Python 文档生成器,通常还有很多更好的编程实践示例。

Python 是一种非常缓慢的高级语言。对于快速数字运算,您必须使用 C/C++ 等低级语言编写主要计算内核,这意味着现在您必须学习的不是一种语言,而是至少两种语言。您还必须处理与调试/安装/维护等相关的额外头痛问题。大多数人使用 Python 作为语法糖来隐藏 C/C++ 的缺点。

现代 Fortran(90 及更高版本)既快速又高级,语法几乎类似于 MATLAB。因此,您可以执行以下操作:

k=k+matmul(transpose(B),matmul(D,B))*weight(i)*detj

或者

indx(:)=indxmap(indx(:),2)

甚至更简单

indx=indxmap(indx,2)

等等。

在 Linux 上有许多免费的 Fortran 编译器。我用

  1. 海合会
  2. 索拉里斯工作室
  3. 开放64
  4. 英特尔(仅限非商业用途)

我不使用 Macs/OSX,但有免费的 PGI。

请不要使用 FORTRAN 77。没有人用它来编写新代码。

免责声明:我个人看 Python 是为了编写我自己的小型非结构化 FE 代码(构建在 PETSc 之上),但所涉及的工作/编码量不仅仅是编写普通的 Fortran 95。

我会远离 Fortan,或者如果你必须使用一个相当新的版本(2003 而不是 77)。很多物理软件(尤其是蒙特卡罗模拟)都是用 Fortran 编写的,仅仅是因为这些项目最初是在 80 年代开始的。

话虽这么说,python 和 Fortran 是两种截然不同的语言,它们的用途也大不相同。Python 是高级别的,而且通常不是那么快(与 Fortran 和 C++ 相比)。它被如此广泛使用的原因是它对于大多数事情来说足够快,并且对于您想做的许多(但不是全部)事情具有出色的(由 Fortran 驱动的)库。它还具有出色的 Matplotlib 绘图(因此不需要 GNUplot),并且您可以通过使用 Cython 之类的东西来编写昂贵的位来获得相当不错的性能。然而,它不会像 Fortran 或 C++ 那样快,而且并行化非常糟糕,使其不适用于高性能数值计算。但是,如果可以通过调用 Fortran 或 C 库来处理您想要的,

Fortran 是一种较低级别的语言。对于数值,库支持出奇的好,但仍然非常低级,会给您带来一大堆本来可以避免的错误,例如不小心将错误的数组大小传递给方法。这些错误很难找到,您可能根本不会注意到它们。相信我,我花了很长时间编写 Fortran 77。

C++(在我看来)是一种快乐的媒介。使用 Armadillo 或 Eigen 等库,您可以摆脱相当高级的编码风格,同时获得低级的性能风格。

说到性能,目前数字 python 唯一真正的选择是 CPython。如果您下载WinPython之类的软件,您还将获得所需的大部分库。

对于 Windows 上的 Fortran,事情要困难一些。我建议切换到 linux 并使用 gfortran 或 Intels ifort 编译器。根据我的经验,ifort 对数字代码往往更快,但仅对非商业、非学术用途免费。

总结一下:除非您想运行非常繁重的模拟,否则 python 是迄今为止更容易的选择,并且使用起来更愉快。对于大多数学生级别的项目,它也应该足够快。如果您需要更好的性能,请先查看已经编写的大量库,然后让它们决定您的语言。如果您必须从头开始编写东西,请使用 C++。

还有一个警告:物理学家编写的大多数代码都非常糟糕,大概是因为物理学家倾向于认为编程很容易,并且不需要像他们在数学中使用的那样严格。考虑上课或购买一本教编程的书。

免责声明:我是一名物理学家,他在基于 Fortran 77 的 Monte Carlo 代码上花费了相当长的时间,目前他所有的数据处理都是在 Python 中完成的。

Python 对于完整的模拟分析非常实用,它具有文档齐全的多功能包:网格生成、数组计算和数据结构处理(numpypandas)以及使用 matplotlib 进行数据可视化。对于具有大结果文件的复杂模拟,最好使用 VTK 包,它允许导出数据以供高级开源应用程序(如 Paraview 或 Visit)读取

一段时间以来, Fortran一直是模拟中不同领域的首选语言。它易于阅读(虽然比 Python 代码可读性差)。数组处理是该语言的强项之一,在使用各种数组操作时非常容易定义和使用。调试时也很方便。

比较归结为性能:我只使用编译语言(C++ 和 Fortran 90)进行了大规模计算,但从未使用 Python。另一个线程提供了有关解释和编译语言的更多性能信息: 在教授计算机编程本科课程时应该使用什么语言?

就个人而言,我一般喜欢使用 Python,尤其是在后期处理方面。Python 编程很有趣!