为什么使用 Python 做科学计算
概述
2021 年 10 月的 TIOBE 编程语言排名中, Python 成功取代了 C 语言排名第一的位置, 这也许不是偶然. 后面我们会详细说明这一点. 我们也很难相信 Python 编程语言实际上比 Java 甚至 Matlab 语言更加成熟, 但是, Python 速度缓慢成为现在许多人的误解, 也被许多研究人员从他们的编程语言备选名单上删除. 这是真的吗? 后面我们会找到答案.
如果你想选择一门编程语言, 它容易学习和阅读, 后期维护简单; 它包含丰富的且高质量的第三方库; 利用它可以快速构建和实现数学模型; 它拥有完备的帮助文档和问答社区; 那么我们推荐您学习 Python.
Python 之所以受欢迎, 主要是因为有充分的理由. 很容易学习, 有很多教育材料, 大量的图书馆可以做所有可以想象到的事情. 特别是在科学计算领域, 有 Numpy、Scipy 和 matplotlib 库, 它们构成了几乎所有东西的基础. Numpy 和Scipy 是使用 Python 作为胶水语言的绝佳示例, 就是将经过实践测试和性能良好的代码粘合在一起, 并为他们提供易于使用的界面. 此外, 机器学习和深度学习框架将 Python 作为首选胶水语言. 最后, Python 是开源的, 这意味着任何人都可以下载并在他们的计算机上安装它, 而无需费心获得许可证等. 这使得分发代码变得更加容易, 例如分发给不同大学的合作者.
Python 2 vs Python 3?
Python 3.0 于 2008 年 9 月推出, 与 Python 2 的语法大多并不兼容. 大约 3-5 年后, 差异才得到充分缩小, 科学界越来越多地采用差异. Python 2 终于在 2020 年不受支持, 到目前为止, Python 3 已成为标准. 现在, 所有新项目都应使用 Python 3, 现有的活跃的开发项目都应升级以使用它.
为什么选择 Python
Python 真的慢吗
是的, 标准 Python 语言的执行是慢的. 这是因为使用解释器的 Python 交互式版本和使用名为 CPython 的内置编译器的标准 Python 的交互版本确实很慢. 但是, 虽然 Python 解释器和 Python 语言可能比 Fortran 或 C 慢, 但 Python 运行时代码不一定慢. SciPy 和 NumPy 等科学计算包没有标准 Python 的诸多缺点.
此外, 除了标准 Python 外, 还有其他重要的 Python 实现, 而且可以比标准 Python 使用更广泛. 此外, 使用一些特殊的 Python 编译器以加快运行, 如 Just-in-Time(JIT)编译器 PyPy, 可以生成运行时代码, 其运行速度可以和 C 一样快或更快.
Python 的优势
Python 的科学使用并不依赖于标准的 Python. 相反, Python 被用作一个粘合层, 依赖于编译过的优化包, 它将这些包串在一起来执行所需的计算. 让我们首先看看 Python 在科学计算环境中的一些优势, 这些优势是使用 Python 的基础.
- Python 内置了对科学计算的支持. 大多数 Python 发行版包括 SciPy 生态系统 (开源), 其中包括 SciPy(SciPy库)、一个名为 NumPy 的数字计算包和多个独立工具包和一个用于可视化的2D绘图库 Matplotlib. Matplotlib 在功能和使用方面与 MATLAB 非常相似, 但是开源的. 使用 mpi4py 可以方便地编写并行程序用于超级计算机集群.
- Python 有通往 MATLAB 或 Octave 的桥梁. Python 可以安装 MATLAB 引擎 API, 以便 Python 程序可以将 MATLAB 称为计算引擎. MATLAB 程序也可以调用 Python 函数, 但有一些限制. Python 的某些发行版可能会使用 Pymatbridge 等 Python 软件包, 该软件包可以同时支持 MATLAB 和 Octave, 并允许在 Jupyter Notebook 中使用 MATLAB.
- Python是一种高度可扩展的语言. 多年来, 开发人员一直将 Python 包装器用于 C/C++ 程序. Python 使用 Python 的 C Foreign Function Interface(cFFI)直接与C 代码交互. SWIG 等工具可以很容易实现这个过程. 开发人员还可以使用 Fortran to Python 接口生成器包 F2Py 从 Python 调用 Fortran 子程序, F2Py 现在是 NumPy 的一部分.
- Python 有非常好的输入/输出 (I/O) 方式. 直到最近, Fortran I/O 传统上一直以记录为基础. 相比之下, Python 长期以来一直支持 I/O 的多个选项和许多其他软件包, 以支持所有类型的I/O格式, 包括实时和流媒体格式.
- Python 对任务自动化有强大的支持. Python 的内置脚本功能和多个软件包支持强大的任务自动化. 重复任务的自动化和执行数据日志记录很容易操作和实现.
- Python 可以使用 Web 前端. Django 和 Flask 等 Python 软件包使开发和使用Python 作为 Web 前端的 API 成为可能. 当使用基于云的基础设施作为访问高性能计算 (HPC) 后端的平台时, 此功能特别有用.
另外, 工具包 Numba 的出现为加速 Python 运行提供了一个很好的选择, 它的使用非常简单, 可以实现 Just-in-Time(JIT)编译, 与 Numpy 配合完成计算密集型任务.
什么时候不使用 Python
很多时候我们不提倡用 Python 取代 Fortran 或 C/C++, 因为, Python 的优势在于集成了多种解决问题的方法. 科学家不再使用单维方法来解决问题; 一般解决一组问题的最佳方法可能有所不同, 因此我们需要使用每种方法的不同工具. Python 是一个很棒的胶水语言, 可以将所有解决问题的工具集成到一个容器中. Python 为科学家提供了一种包装特殊用途工具的强大方法, 并使它们易于从公共应用程序层访问. 因此, 虽然 Python 在当今的科学计算中非常受欢迎, 但肯定有些事情最好留给其他工具.
- 实现性能关键型内核. Python 是一种非常慢的语言, 如果可以利用现有的工具包来完成任务, 例如通过使用 Numpy 数组操作, 那么可以继续使用 Python. 但是, 如果你试图做的事情无法向量化, 那么你就倒霉了. 不过现在有一些工具包, 如 Numba 可以实现 JIT 编译, 来加速 Python 语言中的计算密集部分. 如果你觉得太麻烦, Julia 是 Python 的替代品, 尽管不那么成熟, 生态系统也较小, 但生成的代码非常快.
- 创建可以从其他语言调用的库. 在这种情况下, 通常是创建一个带有 C 接口的库, 然后可以从大多数语言调用该库. 根据任务的不同, 编程语言可以是 Rust、C、C++ 或 Fortran.
大多数科学家使用 MATLAB 或 GNU Octave 等工具进行建模和科学计算. 对于更大的问题和更严格的工作, 研究人员仍然使用 Fortran 或 C/C++. 但他们的速度在很多方面要优于 MATLAB 或者 Octave. 一般来说, Fortran 在数值计算方面比 C/C++ 更快. 另外一个好处是, 它可以使用 OpenMP 和 Open MPI 轻松转换程序用于超级计算机集群. 我们也应当注意到, 在某些些平台上进行 Fortran 优化通常需要使用特定于供应商和平台的特殊编译器. 例如, 您需要英特尔的 Fortran 编译器在英特尔 CPU 集群或 GP-GPU 上优化程序是最优的选择. [1]
新的科学问题解决范式
多年来, 科学解决问题的工具包不断发展. 早期的方法依赖于数学建模和模拟来了解我们周围的宇宙. 随着我们对宇宙理解的加深, 知识体系增长如此之大, 以至于模型变得极其复杂, 难以轻松模拟. 科学家开发了大规模解决科学问题的新方法. 让我们看看其中的几个 [1]:
- 数据驱动的科学研究方法. 为了更好地处理数据洪水, 科学家已经开始转向数据驱动的科学研究方法. 许多科学问题使用统计或贝叶斯分析工具来解决特定类别的问题. 尽管传统使用是基于R 编程的, 但 Python 已成为数据科学家事实上的编程语言.
- 基于发现的科学研究方法. 机器学习和深度学习等认知方法, 以寻找模式和发现相关性, 为科学家提供了另一种基于发现的科学研究方法. 发现是一种深受生命科学研究青睐的方法. 机器学习和深度学习框架主要基于 Python.
- 科学研究的量子计算方法. 量子计算的出现为以前甚至超级计算机也无法解决的问题开辟了全新的解决方案. 大多数量子计算机实现使用某种形式的汇编语言进行编程. Python 为这些实现提供了一个理想的高级包装器和 API, 允许科学研究应用程序和量子计算系统后端之间进行通信.
Python 科学库
- NumPy 数组操作;
- SciPy 科学计算和技术计算的科学家, 分析师和工程师使用的库;
- SymPy 符号计算库
- IPython 和 Jupyter 开发环境, 可以生成带有注释的科学文档;
- Numba 利用 (just-in-time) 编译生成最优的执行代码;
- Dask 并行计算;- Pandas 数据科学;
- Matplotlib 和 Bokeh 数据可视化;
- Scikit-learn 机器学习;
- PyTorch, TensorFlow, Caffe, Theano, Keras 机器学习/深度学习
- NetworkX 复杂网络;- Scikit-image 图像处理;
- PyMC Markov 链和 Monte Carlo;
- Aspropy 天文学;
- Biopython 计算生物学和生物信息学;
- SageMath 一个数学软件系统;
- ScientificPython 科学计算模块的集合;
- Veusz 科学绘图包;
- PsychoPy 神经科学和实验心理学.
- cvxpy, cvxopt 凸优化
参考
[1] Vinay R. Rao. Here’s why you should use Python for scientific research. IBM Developer Blog.
[2] Python for scientific computing. Github.