Python 是非常适合做数值计算的,几乎可以说 Python 是除了老牌的 Fortran、C、C++ 之外最适合做数据科学的计算机语言了。这从近些年 Python 的发展势头就能窥见一斑。Python 已经力压 R 及 Matlab,在数据科学领域风生水起。TIOBE 最新发布的 9 月编程语言排行榜中,Python 凭 4.67% 的增速以 0.26% 的优势力压 C++,逆袭成功进入 Top 3。
Python 是一门免费,灵活且强大的开源语言。使用 Python 能减少大量的开发时间,同时提供简洁易读的语法。使用 Python 可以容易地进行数据操作、数据分析和可视化。Python 提供了一整套功能强大的库,用于科学计算及机器学习相关应用。
Python 做数值计算的基础是 numpy 库。numpy 是 Python 中最常用的数值计算库,提供了一个通用且功能强大的高维数组结构及大量的科学计算函数(其中相当一部分和 scipy 有交叉),是 Python 中几乎所有其他科学计算库的基础。
Python 在 numpy 的基础上打造了一个完整的科学计算生态系统,其中最常用的包括:
scipy: 在 numpy 的基础上提供了科学计算中各种常见问题的解决工具,包括数学物理中的各种特殊函数,数值积分,优化,插值,傅立叶变换,线性代数,信号处理,图像处理,随机数和概率分布,统计学等等。sympy: Python 中的符号计算库,支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散数学、几何学、概率与统计、物理学等方面的功能,能在很大程度上代替 Mathematica 和 Matlab 的符号计算功能。IPython: 一个 Python 的交互式开发和计算环境,比 Python 自带的 shell 好用且功能强大得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数。 IPython notebook 可以将代码、图像、注释、公式和作图集于一体,已经成为用 Python 做教学、计算、科研的一个重要工具。matplotlb: Python 做科学计算最常用和最重要的画图和数据可视化工具包。pandas: Python 中常用的数据分析包,适合时间序列及金融数据分析。scikit-learn:Python 的机器学习库。 它具有各种分类,回归和聚类算法,包括支持向量机,随机森林,梯度增强,k 均值等各类机器学习算法,可以与 Python 数值和科学计算库 numpy 和 scipy 互操作。以上是 Python 中较为基础的数值和科学计算工具,一般来说只适用于在单台机器上进行计算工作,虽然可以使用多个线程或者 joblib 之类的工具进行并行加速(IPython.parallel 模块例外,可以运行在一个由多台计算机组成的集群上)。如果要进行更大规模的数值和科学计算,使用并行及分布式计算就很有必要了。Python 也提供了相应的工具来支持大规模的并行分布式计算,可以使用的工具有:
Dask:Dask 是一个用于数值和科学计算的灵活的并行计算库,它提供了一个优化的并行任务调度器和若干并行的数据结构:Dask Array 是一个分布式并行的 numpy 数值,Dask Bag 是一个分布式并行的 Python 序列集合,Dask Dataframe 是一个分布式并行的 Pandas dataframe。另外 Dask-ML 将 scikit-learn 中的机器学习算法都并行化了,可以处理更大规模的数据运算。
mpi4py:Python 中 MPI (消息传递)库。mpi4py 库与 numpy 数组结合紧密,可以高效地在不同的 MPI 进程包括不同的计算节点之间交换 numpy 数组数据。可以使用 mpi4py 在 Python 中非常容易地编写基于 MPI 的并行计算程序,然后在大型计算集群或者超级计算机上运行。偶的个人[简书专题](https://www.jianshu.com/c/5019bb7bada6)和 [CSDN 博客专栏](https://blog.csdn.net/column/details/26248.html)中有对用 mpi4py 做并行计算的专门介绍并提供了大量的程序实例。有需要或者感兴趣的可以了解下。IPython.parallel:支持多种形式的并行计算,包括单程序多数据流(SPMD)并行,多程序多数据流(MPMD)并行,MPI 并行,数据并行等,可以非常容易地将计算任务部署到一个集群上并行地执行。pySpark:针对 Spark 的 Python API,可以使用它在 Python 中进行大数据分析和大规模的机器学习应用。可能不是很适合大规模高性能数值和科学计算。大规模的数值和科学计算也经常涉及大量的数据 I/O 操作,I/O 操作往往是高性能计算的瓶颈所在,MPI 的 ROMIO 库提供了高效的并行 I/O 支持,可以使用 mpi4py 进行并行 I/O 操作,或者使用支持并行 I/O 的科学数据存储文件格式,如 HDF5 (Hierarchical Data Format)。Python 中的 h5py 和 PyTable 提供了对 HDF5 文件数据操作的支持,Pandas 中也有相应的函数可以读取 HDF5 文件中的数据或者将数据存储到 HDF5 文件中。