软问题:Python在哪里适合图片?


9

所以我一直在争论我是否应该去学习Python。与我的教授交谈后,就学术界而言,Matlab似乎是应用数学/计算科学中使用的通用语言。在工业界时,我的教授们(尤其是那些在工业界工作的人)说,学习c ++是最安全的方法。

我想听听你们在学术界和行业中的人,我是否应该打扰Python,或者只是暂时擅长于我所知道的(MATLAB和C ++)。

更新:杰夫提出了一个很好的观点,我可能应该提出更多细节:

去年,我目前是本科生,攻读计算专业的数学。我想去读研究生,继续研究(我从未见过自己喜欢教书)或在实验室工作。两者都是理想的。至于研究领域,可能涉及数值分析或概率论。万一计划A不能奏效,我会愿意在工业界工作,只要为自己为工业做准备不会花太多时间上学。因此,我认为我应该学习行业中通用的语言,作为备份。但这也是为什么我感到矛盾。我无法学习每种语言,也无法为每种可能性做好准备,因为这会花费太多时间。


1
您的问题是一个好问题,但可能有点过于开放和模糊。您正在学习什么学科,您认为您可能想做什么?
Geoff Oxberry

1
有关使用Python无法在MATLAB或纯C ++中正常运行的事情的示例:epubs.siam.org/doi/abs/10.1137/110856976。(无耻的自我
激励

Answers:


15

这些类型的问题中的任何一个难题都是答案高度依赖社区。

要以随意的顺序回答您的一些问题:

MATLAB在学术界和工业界都被广泛使用。它在行业中使用很多的原因之一是因为它是在学术界教授的。我知道,林肯实验室和杜邦的研发部门都使用了MATLAB。

有一些用Python编写的擅长符号计算的软件包,例如sympy和SAGE。根据您的特定兴趣,功能要求和个人喜好,Mathematica(或Maple或其他计算机代数系统)可能优于这些软件包。

MATLAB有一个Symbolic Math Toolbox,可以用于某些符号计算,但是据我的经验,它的符号操作能力比Mathematica和Python弱。理论上,可以在C ++中完成一些符号操作,但这并不方便。MATLAB也不是一种好的通用语言。它能很好地完成线性代数和数值数学,但它没有良好的输入/输出功能。与C ++或Python相比,它没有良好的并行功能(即使有并行MATLAB,MATLAB Star-P和Parallel Computing Toolbox之类的变体)。即使是其图形功能也可能需要一些工作。除非您隶属于拥有许可证的机构,否则MATLAB也会很昂贵。每个工具箱的购买价格昂贵,并且通常花费数百至数千美元。

Mathematica除了进行符号计算外,还进行数值计算。我还没有看到人们像使用Python和MATLAB进行数字计算那样使用它进行数值计算。它也具有并行功能,但无法扩展到大型超级计算机。

Python是一种很好的通用语言,被认为易于学习和使用。它用于大型超级计算机(例如,参见PyClaw,petsc4py,mpi4py等),并且可以很好地扩展。它还具有高度重视的数值程序包(例如NumPy和SciPy);庞大而活跃的社区;良好的输入/输出处理能力;和优质的图形库,以及大量的库(请查看PyPI)。与上述专有软件包相比,它是免费的。您可以在免费提供的Python包中找到MATLAB或Mathematica的大多数功能。Python的主要缺点是它比C ++这样的编译语言要慢,尽管随着Cython,Numba和PyPy的不断发展,这种缺点正在逐渐消失。也可以通过用C(或C ++或Fortran)代码和适当编写的Python包装程序代替较慢的Python代码来缓解这种情况。被解释后,许多人报告说使用Python比编译语言具有更高的生产率。它很受欢迎,如果有时间,可能值得学习。

C ++是一种复杂的语言,其在计算科学中的使用引起争议。其庞大的功能集可以使编写易于维护且需要永久编译的软件变得容易。但是,明智地使用诸如模板和运算符重载之类的功能可以发挥很大的作用,就像在Deal.II,Blaze和Elemental等项目中一样。就其高级功能而言,C ++的学习曲线很陡峭,而且我听说过很多传闻,人们花了很多年才觉得自己已经学会了完整的语言。尽管如此,尽管有可用性问题和复杂的功能集,它还是一种流行的语言。如果仅仅是使自己更具就业能力,那可能值得学习。它在计算科学方面的主要竞争对手是Fortran和C,它们也值得学习。

您决定学习的内容将取决于您的实际需求。当然,学习Python和C ++很好,但是由于时间和资源的限制,您可能只会学习实际需要使用的内容,这取决于您所在的社区。


因此,就学术界而言,您会说花时间学习Python而不是C ++更好吗?
AlanH

1
同样,这一切都取决于。我在事物的学术性方面仍然更多,并且我一直都在使用Python。我还必须使用C ++进行用该语言编写的工作。我个人的观点是,与首先学习C ++相比,首先学习Python可能会为您带来更快的回报,但是我不知道人们会使用哪种概率论者/随机过程/组合论者,因此您的学习目标可能会有所不同。
Geoff Oxberry

我同意Geoff的观点,首先学习python是一个好主意,因为它将使您更快地学习。C ++是一门很好的语言,但是学习曲线要​​高得多,全心全意地学习它比根本不学习它更糟。
LKlevin

“就其高级功能而言,C ++的学习曲线很陡峭,而且我听说过很多传闻,人们花了很多年才觉得自己已经学会了全部语言。” 是的,我完全同意。我认为,凡是精打细算的程序员都应该在生活中学习一些c / c ++,但要真正成为专家,肯定需要10,000个小时。+1
詹姆斯

11

正如Misha和Geoff Oxberry指出的那样,Mathematica确实具有不同的重点(只是因为您可以用螺丝刀敲打指甲并不意味着应该这样做)。因此,我认为您的问题是“如果我了解Matlab,为什么还要学习Python?” [编辑:显然,是你做的。]

出于所有意图和目的,Matlab是科学计算的英文-这种类比具有所有正面和负面的含义。一个特定的优点是,与其他任何语言的代码相比,Matlab代码对更多的人可能是有用的(即,可执行且易于理解)。(这是我为所有算法提供Matlab代码的主要原因。)此外,在进行原型设计时,Matlab桌面确实非常有用,尤其是能够直接从编辑器运行部分代码(单元)的功能,以及在探查器中。

话虽这么说,如果您确实想学习另一种高级语言来获得乐趣和收益,那么您可能会比Python做得更糟。除了Geoff列出的原因外,还有其他一些原因:

  • 与Python中的外部程序和库进行交互要容易得多。没有更多的mex文件!

  • 如果您不在桌面上,那么启动并运行Python + NumPy / SciPy比访问Matlab许可证要容易得多。

  • Matlab比NumPy更快的主要原因是它捆绑了针对线性代数(MKL,ACML)的优化供应商库。可以(如果有些乏味)构建自己的NumPy并将其链接到相同的库,以获得与Matlab线性代数几乎相同的性能(和多线程),以及Python在其他所有方面的更好性能。(尽管那当然甚至需要用于学术用途的许可证,从而抵消了免费软件的奖金,但在办公室和现成的雇主赞助的加速安装中使用相同的代码仍然是一个有趣的选择。安装在家用计算机或笔记本上。)

  • 尽管Matlab的工具箱是其卖点之一,但在某些方面Python仍处于领先地位。特别是,SymPyFEniCS很大程度上击败了Symbolic和PDE工具箱。

  • 不要忘记有趣的部分(尽管有语义空格和名称绑定):我看到几个同事被Python bug咬住了,用Python编写您的算法确实确实令人满足,而Matlab却没有(虽然那可能只是学习外语的乐趣):)

(如果您确实从NumPy开始,则可能会发现此页面有帮助。)


5

Python可能会替代c ++和Matlab。它在学术界和工业界都得到了广泛传播。在工业中,它有时用作低级语言(主要是c / c ++)的胶水。Mathematica完全是另一个故事。它的主要优势是在符号计算中其他所有提到的方面(c / c ++; Matlab; Python)都不是很好。

因此,这四个完全不同:c ++是古老且稳定的较低级编程语言;Python是新兴的高级计算机语言。Matlab是一个数值计算环境,着重于矢量代数(尽管它能够或多或少地完成所有工作);Mathematica是一种计算机代数系统,在符号计算上具有很强的重音(与matlab相同)。因此,它们不是竞争对手。


确实; 当我看到人们使用Mathematica进行科学计算时,我常常感到困惑(有时会感到惊讶)
Christian Clason

@ChristianClason和Misha:这是一个误解,认为Mathematica主要是计算机代数系统。如果你看看人们实际上如何使用它,大部分是没有符号代数,并在几个数字字段它是一个像MATLAB和R.工具竞争力(个人而言,我会选择MMA的在这些其他两个用于大多数数值数据处理任务,但这当然是个人喜好。)在某些领域,例如数值积分或可视化,它似乎领先于MATLAB。在其他诸如PDE解决方案中,它落后了。
Szabolcs

对于只对数值计算感兴趣的人,Python是MATLAB的替代产品,它是一种相对高级的语言,其使用库例程来处理涉及线性代数,傅立叶变换,特殊函数等标准化计算的能力相似。是的,Python的适用范围更广,但它确实涵盖了您可能在MATLAB中所做的一切。
Brian Borchers 2015年

4

我知道您的问题与python的使用有关,但是您说过您对“数值分析或概率”感兴趣。我不知道您是否考虑过R,但它是专门为此类工作而设计的。R是用于概率和统计的非常强大的语言,并且拥有大量活跃的数学家和科学家用户群。

R与Matlab的不同之处在于它是开源的,具有统计重点,并绘制了一些非常令人印象深刻的图(请参阅ggplot2)。您可以在R中完成几乎可以在Matlab中完成的所有工作,但是我最喜欢的方面是用户的贡献。大部分贡献的库都是由科学家编写的,并在统计杂志上发表。他们也有写得很好的指南(称为参考书和小插图)。我最喜欢的新库提供了基于CULA库构建的CUDA支持(免费供学术使用)。也存在大量的概率论方法(请参阅此处)。

无论如何,R绝对是为您的工作线专门设计的,因此请检查一下并考虑将其添加到您的工具包中:)请记住,您可以在Python中执行R脚本,在R中执行Python脚本,并轻松捕获输出。

祝你好运!


2

其他人已经发表了比我在这里尝试的内容更多的评论。但是,我想再次强调一点:这取决于您的社区。例如,如果您正在从事电气工程项目,则很可能会使用Matlab;如果您是一位数值分析师,想对一个简单的模型问题验证收敛速度估计,则可能同样如此。

另一方面,如果您想进行科学的计算(例如,模拟机翼周围的流动,模拟等离子体中的核聚变,模拟地幔中的对流)或考虑到此类应用而开发数值方法,那么可以参考franca是C ++。如今,无论好坏,每个大型科学计算包都用C ++(或C)编写,这将在很长一段时间内保持下去。仅举几个例子,PETSc和令人难以置信的大而多样化的Trilinos软件包分别用C和C ++编写。我可以想到的大型开源有限元库(libMesh,deal.II,oofem,freefem)中的每一个都是用C ++编写的。在可视化程序中,最大的两个程序(Visit和Paraview)是用C ++编写的。我可以扩大清单。

关键是,如果您对小规模仿真感到满意,那么人们会使用一种语言,但是每当涉及到严肃的(也许是并行计算)时,他们都会使用其他语言。当然,这是社区事务,而且还具有互操作性-如果PETSc和Trilinos是用C和C ++编写的,那么即使我愿意,我(作为Deal.II的作者)也无法轻易选择任何其他语言,因为我需要与PETSc和Trilinos合作。


1
公平地说,有很多来自Fortran的PETSc用户,还有很多来自Python的用户。尽管几乎所有语言都可以调用C,但是混合语言编程本身也面临着一系列挑战,我不建议经常使用它。您的代码在堆栈中的位置问题也经常被忽略。例如,最终用户应用程序应该做出与系统级库不同的软件设计选择。
杰德·布朗

这还算公平。但是,确实如此,如今,用于大规模计算的软件的最新实例绝大多数是用C和C ++编写的(尽管使用Fortran编写的保留时间更长)。
Wolfgang Bangerth

1

加上我的两分钱,我既有最近的学术经验(应届博士学位,:),又有行业经验(测量设备制造商)。

我们在弱嵌入式处理器(例如手机处理器)上进行了大量的数值计算。除了没有适用于ARM的MATLAB外,C ++在这个世界上是王者-许多嵌入式编译器套件都不包含FORTAN!

虽然我们确实有数量有限的MATLAB许可证,但制造2瓦功率产品的要求使我们的开发工作偏向于C ++(不包括实验)。

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.