易于学习
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。我发现使用它很痛苦,但是有些人喜欢这种工作流程。您还可以安装带有Visual Fortran之类的GUI的编译器(同样,您必须付费购买许可证)。
在Linux上,安装Python和编译器会更容易。我仍然会安装Anaconda或Enthought Canopy作为Python发行版。
速度:生产率与性能的权衡
在使用Python(或MATLAB,Mathematica,Maple或任何解释语言)时,您会牺牲性能以提高生产率。与Fortran(或C ++,C或任何其他编译语言)相比,您将编写更少的代码行来完成相同的任务,这通常意味着您将花费更少的时间来获得有效的解决方案。
使用Python的有效性能损失各不相同,并且通过将计算密集型任务委托给编译语言来缓解。MATLAB做类似的事情。在MATLAB中进行矩阵乘法时,它会调用BLAS。性能损失几乎为零,您无需编写任何Fortran,C或C ++即可获得高性能。Python中也存在类似情况。如果可以使用库(例如,FEniCS的NumPy,SciPy,petsc4py,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方面已有大约5年的编程经验。我使用Python比使用Fortran多得多,因为坦率地说,我在Python中能完成更多工作。我需要做的大部分工作不需要大量的超级计算资源,并且通常不值得用另一种语言进行重新开发,因此Python非常适合解决ODE和PDE。如果需要使用编译语言,则将依次使用C,C ++或Fortran。
我见过的大多数Fortran代码都很丑陋,主要是因为大多数计算科学界似乎都不了解或不赞成软件工程师在过去30年中发现的任何最佳实践。断言:Fortran中没有好的单元测试框架。(我遇到的最好的是NASA的FUnit,现在不再维护。)有一些不错的Python单元测试框架,不错的Python文档生成器,以及通常有很多更好的编程实践示例。