软问题:Python 在哪里适合?

计算科学 matlab Python C++
2021-12-04 04:46:01

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

我想听听来自学术界和工业界的你们的意见,我是否应该为 Python 而烦恼,或者暂时只精通我所知道的(MATLAB 和 C++)。

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

我现在是我最后一年的本科生,学习数学,专攻计算。我想攻读研究生院并继续从事研究(我从未见过自己喜欢教学)或在实验室工作。这两个都是理想的。至于研究的领域,可能是数值分析或概率方面的东西。万一A计划不成功,我愿意在工业界工作,只要自己为工业界做准备不会占用学校太多时间。所以,我想我应该学习工业中常见的语言作为备份。但这也是我矛盾的原因。我不能学习每一种语言或为每一种可能性做好准备,因为那会花费太多时间。

4个回答

任何这些类型的问题的困难在于答案高度依赖于社区。

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

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

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

MATLAB 有一个 Symbolic Math Toolbox,可用于一些符号计算,但根据我的经验,它的符号操作能力比 Mathematica 和 Python 弱。一些符号操作理论上可以在 C++ 中完成,但它很笨拙。MATLAB 也不是一个好的通用语言。它在线性代数和数值数学方面做得很好,但它没有很好的输入/输出能力。与 C++ 或 Python 相比,它没有很好的并行能力(即使有并行 MATLAB、MATLAB Star-P 和并行计算工具箱等变体)。甚至它的图形功能也可能需要一些工作。除非您隶属于拥有许可证的机构,否则 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++ 很好,但鉴于时间和资源限制,您可能只会学习实际需要使用的内容,这取决于您所在的社区。

正如 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 错误所困扰,用 Python 编写算法确实有一些奇怪的满足感,而 Matlab 中没有(虽然这可能只是学习外语的乐趣):)

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

Python 可能会替代 c++ 和 Matlab。它在学术界和工业界都得到了很好的传播。在工业中,它有时被用作低级语言的粘合剂,主要是 c/c++。Mathematica 完全是另一回事。它的主要优点是所有其他提到的(c/c++;Matlab;Python)都不好:在符号计算中。

所以,这四种是完全不同的:c++ 是古老而稳定的相对低级的编程语言;Python 是一种新的、不断发展的高级计算机语言;Matlab 是一个强调向量代数的数值计算环境(尽管它或多或少可以做任何事情);Mathematica 是一个计算机代数系统,强调符号计算(与 matlab 相同)。因此,他们不是竞争对手。

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

R 与 Matlab 的不同之处在于它是开源的,侧重于统计数据,并且绘制了一些非常令人印象深刻的图(参见ggplot2)。你可以在 R 中做几乎所有可以在 Matlab 中做的事情,但我最喜欢的方面是用户贡献。大多数贡献的图书馆都是由科学家编写的,并发表在统计期刊上。他们也有写得非常好的指南(称为参考和小插曲)。我最喜欢的新库提供了基于CULA库的CUDA 支持(免费供学术使用)。概率论也有大量的方法(见这里)。

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

祝你好运!