Python 与数据科学
数据科学编程语言
上文提到,Python 是数据科学领域最受欢迎的编程语言之一,主要因其简洁易懂的语法和丰富的科学计算库。
同样是面向数据科学的编程语言,R 和 MATLAB 的流行度和影响力远不及 Python。
R 语言主要用于统计分析和可视化,也是一门开源的编程语言。R 语言社区提供了大量的统计和可视化的包,使得它在统计学、经济学、管理学等方向上被广泛使用。然而,R 的语法和数据结构相比 Python 更具有挑战性,对初学者不太友好。R 语言上目前没有可以与 Python 社区中的 PyTorch 、TensorFlow 竞争的包,其对深度学习支持不及 Python。
MATLAB 是一款经典的数值计算语言,广泛应用于工程和科学研究领域。MATLAB 提供了丰富的工具箱,如信号处理、图像处理、机器学习等。然而,MATLAB 是商业软件,需要购买许可证,且许可证的售价不菲,只有少数的科研机构和企业才能支付许可证费用,这在一定程度上限制了 MATLAB 的大规模使用。
除此之外,还有一些更加小众的编程语言,比如编写 Apache Spark 的 Scala,数值计算软件 Mathematica。Scala 对于程序员来说,学习起来相对难度大,主要面向以 Spark 为代表的大数据处理场景。Mathematica 专注于数值和符号计算,而且也是一个商业软件。这些特性决定了,Scala 、 Mathematica 等语言受众更小。
Python 数据科学生态
对于上述竞品,Python 数据科学生态中均有相应的库。
NumPy
NumPy 可用于处理多维数组的数值计算。它底层是一个多维数组对象 ndarray
,ndarray
可表示任意维度的数组。基于 ndarray
,用户可以进行数学、线性代数、傅里叶变换等科学计算。NumPy 是许多 Python 科学计算库的基础,如 pandas、Matplotlib、SciPy,这些库提供的功能与 MATLAB 提供的数组和矩阵操作非常相似。因此,NumPy 经常被认为是付费的 MATLAB 的开源替代。
NumPy 底层主要使用 C 语言实现,一些复杂的运算(如矩阵乘法、快速傅里叶变换等)则使用了优秀的底层计算库。比如,在进行矩阵乘法时,NumPy 是会选择某个 BLAS(Basic Linear Algebra Subprograms)底层计算库,调用 BLAS 库的 dgemm 或 sgemm 函数(分别为双精度和单精度)来进行矩阵乘法。BLAS是一套高效的线性代数库,包括向量运算、矩阵运算等基本操作,常见的实现有 OpenBLAS 、Intel MKL (Math Kernel Library)。这些 BLAS 库对多核和特定的 CPU 进行了优化,性能非常好。
pandas
pandas 是 Python 社区中的高性能数据分析库。pandas 的名字来源于 "Panel Data" 和 "Python Data Analysis",即对面板数据进行数据分析。
pandas 的核心的数据结构是 DataFrame
。 DataFrame
是一个二维的、类似于 Excel 的数据结构,DataFrame
有很多列,每一列有该列的属性定义和数据类型;DataFrame
有很多行,每行是一条数据。用户使用 pandas 可以进行几乎所有基于 Excel 和 SQL 的数据分析和操作。相比 Excel,panads 能够处理的数据更大,可编程能力更强,可与其他 Python 库紧密结合。相比 SQL,pandas 的语法更灵活丰富。dplyr 和 data.table 是 R 语言中进行类似操作的包。
scikit-learn 与 XGBoost
scikit-learn 支持包括分类、回归、聚类和降维等在内的大多数机器学习任务,包含了许多知名的机器学习算法的实现,如支持向量机、随机森林、梯度提升、k-近邻等。scikit-learn 提供了一套统一的接口,使得使用和切换不同的算法非常方便。此外,scikit-learn 还提供了一些用于数据预处理、模型选择和评估的工具,如归一化、交叉验证等。
XGBoost 是决策树机器学习库,与之类似的库还有 LightGBM。XGBoost 和 LightGBM 都是基于决策树模型,在很多问题上的准确性强于神经网络,且拥有很强的可解释性。
包括 scikit-learn 、XGBoost 和 LightGBM,Python 社区的机器学习库使得其吸引了大量用户,这是其他编程语言所无法达到的。
PyTorch 与 TensorFlow
PyTorch 和 TensorFlow 是近年来非常火热的深度学习库。尽管 PyTorch 和 TensorFlow 等深度学习库的底层都基于 C++ 语言实现,但对于用户来说,只需要调用 Python 接口,完成神经网络训练或者推理任务。Python 的易用性使得神经网络的开发、实验、部署等各个流程的速度获得极大提升。
由于主流深度学习框架首先适配 Python 语言,Python 已经成为深度学习领域标准的编程语言。这也是其他编程语言难以追赶 Python 的关键所在。
Dask、Ray 与 Xorbits
原生的 Python 在分布式计算上捉襟见肘。Apache Spark 是大数据批处理的标准,企业经常采用 Spark 进行大数据处理和分析,Spark 主要使用 Scala 和 Java 编写,面向 Java 社区,pyspark 虽然提供了 Python 接口,但只是一个桥梁,如果使用 Spark 进行更加精细化的大数据任务,仍需要学习 Scala 或者 Java。可以说,此前在大数据处理领域,Python 相对劣势。
但随着 Dask 、Ray 和 Xorbits 等库的成熟,一些原本需要使用 Scala 编写的 Spark 任务,有可能逐渐迁移到更加 Python 原生的库上,比如 Dask、Ray 或 Xorbits 上。Dask 、Ray 和 Xorbits 提供的功能稍有区别,它们可以从不同维度上将 Python 任务横向扩展到多节点,实现并行计算。