易于学习
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 文档生成器,通常还有很多更好的编程实践示例。