Python与FORTRAN


17

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

我目前正在Windows机器上工作。

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

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

您还会推荐哪些编译器?

对我而言,基本问题归结为:哪个是最容易学习的,哪个是最快的,哪个是最人性化的,最重要的是哪个是最常用的(因此将这4个进行比较)?除此之外,最常用的(免费或付费)编译器是什么?我目前正在考虑将旧的笔记本电脑(早期的英特尔双核)转换为Linux。希望那足够快。

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

如果有任何帮助,我几乎完全了解C ++,Maple的基础知识,并且几乎完全掌握了MATLAB和Mathematica9。


12
您确实需要更具体;这就像问“哪个更好:锤子还是螺丝刀?”。看一看scicomp.stackexchange.com/questions/11006(它是关于C ++而不是Fortran的,但是多数要点应同样适用)。
克里斯蒂安·克拉森

@ChristianClason,要点:p
尼克

感谢您的编辑,尽管这并不能真正缩小范围。我不确定可以说的是上面链接问题的答案。
克里斯蒂安·克拉森

2
同样,关于编译器的问题是一个单独的问题,应该是一个单独的问题。(否则,熟悉Fortran但对Python不感兴趣的人将看不到它。)scicomp.stackexchange.com/questions/8617中已经给出了一些建议。
克里斯蒂安·克拉森

1
如果您了解matlab,则可以通过在其中实现大多数数值算法来学习大多数数值算法,尽管您的性能几乎总是比内置的matlab例程差。在这里,您可以决定自己的性能需求,然后转向更高效的库/语言。
Godric Seer 2014年

Answers:


29

易于学习

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


非常好的和完整的答案:)。我昨天安装了已经存在python-compiler的Linux。现在我想知道是否有一种简单的方法可以在Linux和Windows计算机之间共享文件?我注意到,每当我使用摇杆传输数据时,Windows和Linux机器都将忽略目的地(以NFTS格式格式化)上的某些部分。
尼克

而我的最后一个问题是使用FAT32格式(至少到目前为止)解决了bij问题。
尼克

注意:FAT32的最大文件大小有限。
meawoppl

@Meawoppl,在Linux和Windows之间是否有更方便的方法来交换文件?也许保管箱呢?是否还有基于硬件的解决方案?
尼克,

将您的文件保持在4GB以下:P确实,我不知道一个好的解决方案。文件名约定中也存在一些错误。我记得曾经通过命名文件<3.txt破坏了Windows的支持,这使M $看上去非常可悲。现在,Linux对NTFS的支持相当不错,但在OSX中却完全不能使用。我真的以为到现在我们已经解决了这个问题。
meawoppl

7

我会远离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的蒙特卡洛代码,目前正在用Python处理所有数据。


关于并行化,研究人员已在成千上万的内核上以良好的并行效率成功地并行使用了Python。(例如,PyClaw已在Shaheen的全部计算机上运行,​​这是65,000多个内核。)
Geoff Oxberry

1
确实有可能,但是据我所知,只有确保并行部分发生在CPython之外,这是相当大的努力。例如,PyClaw(PETSc)的并行部分用C编写。另一个选择是运行CPython的多个实例,但这并不简单。
LKlevin

大多数并行应用程序都是不平凡的。您写道:“ [Python]并行化非常糟糕,不足以进行高性能数值计算。” 没有人用纯Python编写任何高性能代码。该决定的理由与并行性无关,只要适当地使用Python,就不会使Python作为高性能计算中的接口语言无效。您的报价是一个稻草人,它解决了并行性,高性能和解释性语言的问题;没有人会设计这样的应用程序。
2014年

我同意Python几乎可以用于任何目的的出色界面语言,但这已经摆脱了这个问题。大多数应用程序都是不平凡的,这里的问题是并行化的所有情况,包括平凡的情况,在python中都是不平凡的。如果以Numpy或Cython运算很好地描述了您的问题,这可能会很麻烦。不,您不会在65000核心群集上使用它,但是您可能会接受100核心上2倍的性能下降。
LKlevin

Wrt并行性,关于Fortran的好处是,除了MPI / OpenMP之外,还有协数组现在已成为标准的一部分。例如,请参阅此jolts.stanford.edu/72/…– stali 2014
20:01

7

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. Solaris Studio
  3. Open64的
  4. 英特尔(仅非商业用途)

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

并且请不要使用FORTRAN77。没有人使用它来编写新代码。

免责声明:我个人使用Python编写了自己的小型非结构化FE代码(在PETSc的顶部构建),但是涉及的工作/代码数量不仅仅是将其编写为纯Fortran 95。


1
为此,我要补充一点,您可以在Fortran 2003中进行非常认真的面向对象编程;例如参见本指南。我在自己的代码中经常使用它,对于我想做的事情非常有效。很多人会告诉您避免这样做-我说要保持开放的态度,您可能会非常喜欢它。当然可以
Daniel Shapero 2014年

4

蟒蛇 非常适合使用文档全面的通用软件包进行全面的仿真分析:网格生成,数组计算和数据结构处理(numpypandas))以及使用matplotlib进行数据可视化。对于具有大结果文件的复杂模拟,最好使用VTK软件包,该软件包允许导出的数据由高级开源应用程序(如Paraview或Visit)读取。

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

比较下降到 性能:我只使用编译语言(C ++和Fortran 90)进行了大规模计算,而从未使用Python进行过。另一个线程提供了有关解释和编译语言的更多性能信息: 在计算机编程本科课程中应该使用哪种语言?

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


1
性能几乎总是很重要的。人们缺乏对性能的关注,这就是为什么人们需要8个内核和16Gb RAM来检查电子邮件和上网。
stali 2014年

我不幸不得不阅读别人的python代码。我不会将py代码归类为易于阅读的代码。
Biswajit Banerjee 2014年

@stali:我完全同意
萨阿德

1
@BiswajitBanerjee:用任何语言编写复杂的代码并不是没有可能,但是至少我可以轻松识别任何函数的输入和输出,这就是Fortran变得可怕的地方!:)
SAAD 2014年

3

使用Python,您不需要Gnuplot,可以使用例如matplotlib和/或使用IPython shell。IPython是一个交互式Python Shell,在%pylab模式下,它提供与MATLAB中几乎相同的绘图命令。

在未来5年以上的时间里,科学计算很有可能会从MATLAB转向Python。


Gnuplot的优点之一是,它几乎总是安装在Linux机器(群集/服务器等)上,对于快速/肮脏的viz非常有用。就像vi for viz。
stali 2014年

1

我会继续使用MATLAB,它将调用快速数学库,并且在Windows上切换到FORTRAN不会在性能上产生太大差异。同时,您将在MATLAB中拥有更好的基础结构来报告结果和运行代码。MATLAB的缺点是它的成本。FORTRAN基本上是免费的,并且那里有很多免费的库。

FORTRAN非常易于学习和开始进行编程。它基本上如其名称所建议的那样:将您的公式转换为易于阅读和理解的代码。这就是为什么物理学家在过去经常使用它。只要您的大多数代码都是关于解决物理问题的(而不是构建GUI或做其他有趣的事情),那么FORTRAN代码将易于维护。

我只建议您喜欢编程的人使用Python。考虑一下:编写物理问题的解决方案时,您喜欢对解决方案进行编程吗?如果这样做,则可以选择使用Python,因为该语言比MATLAB的语言好得多。


2
您关于从MATLAB切换到Fortran的性能差异的说法通常是不正确的。如果您要编写的代码自然是一个很好的数据结构,而数组可以处理I / O,并且拥有所需的库,那么Fortran就是很棒的选择。Python中的数字库在功能上与MATLAB有很多重叠,我发现将Python接口编写为C代码比将MATLAB接口编写为C代码更容易。
2014年

有时您确实会看到很大的不同。我最近将一个物理仿真程序从Matlab(内部使用bvp6c包)重写为Fortran 2008(内部使用bvp_solver包),并且即使不更改算法,切换后的执行时间也仅为1.4%。或程序的整体结构。对于过去每个数据点需要约3.5天才能收敛的仿真,这是一个非常明显的改进。
jabirali
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.