Python、Julia和Rust是数据科学的三种领先语言,但每种语言都有不同的优势。这是你需要知道的。
最强大、最灵活的数据科学工具是编程语言。有时,正确解决数据科学问题的唯一方法是滚动自己的解决方案,即使只有几行代码。但编程语言也需要时间来掌握,您选择的语言将受到许多因素的影响,包括您现有的编程经验、问题范围以及您是否需要优先考虑执行速度或开发速度。
在本文中,我们将研究三种对现代数据科学影响最大的编程语言。这些语言不仅对其强大和速度至关重要,而且对便利性以及如何通过第三方库实现数据驱动工作也至关重要。
Python
如果不提到Python,就不可能讨论现代数据科学。在过去的10年里,这种有几十年历史的语言的受欢迎程度大幅提高,部分原因是它已成为数据科学事实上的语言。
Python的两个大卖点在这里发挥作用。首先,Python是一种相对容易编程的语言。您可以在Python中快速制作工作软件的原型,并(如果需要)随着时间的推移逐步提高其性能。数据科学项目不像其他语言那样需要那么多时间来站起来在Python中运行。它还有助于现有的数据科学文化提供许多快速模板,您可以将其用于您自己的基于Python的项目。
第二个大卖点是Python的第三方库生态系统,它几乎可以保证其他人已经为您遇到的任何问题开发了预打包的解决方案。该生态系统包含数据科学的财富:数字处理库(NumPy,Pandas,Polars);图形和绘图工具(Bokeh,Plotly);可复制工作的笔记本环境(Jupyter);机器学习和人工智能工具包(PyTorch);分析工具(DuckDB);等等。
然而,尽管Python很受欢迎,但Python有缺点,这使得一些数据科学应用程序更难开发和部署。
Python缺乏将Python应用程序作为独立程序部署的本机机制。如果您编写Python库,您可以通过PyPI将该库打包并分发给其他用户。但这意味着其他用户知道如何设置Python环境来使用您的代码。以没有Python经验的人可以下载并运行它的方式打包Python程序要困难得多。请注意,这并非不可能;只是困难,并且Python的工具链不支持原生。
想要重新打包他们创建的Python工具供他人使用的数据科学人员的选择有限。他们可以将工作部署为库,并假设对方知道Python(并不总是正确);他们可以通过Web界面部署相关应用程序(并不总是可行);他们可以通过Docker等容器系统进行部署(同样,对方并不总是熟悉);或者他们可以使用第三方工具将Python运行时与他们的应用程序及其库打包(并不总是可靠)。
另一个缺点是原生Python代码的速度。在执行基于CPU的计算时,它比C、Rust、Julia或其他语言慢得多。这意味着任何高性能的Python代码通常都不是用Python本身编写的,这在您和您正在做的工作之间施加了额外的抽象。正在努力使原生Python更快,但我们不太可能在短期内看到类似于机器原生代码可以生成的速度。
Julia
Julia语言于2012年首次发布,是专门为数据科学家创建的。它的创建者希望拥有一种像Python一样易于使用的语言,但像C或Fortran一样快,并且不必一次使用多种语言来获得最佳效果。
Julia通过LLVM编译器系统将“及时”编译或JITed编译为机器原生代码来发挥其魔力。Julia代码具有Python语法的简单性,因此编写简单,并支持快速结果。您可以先让编译器推断类型,然后提供类型注释,以便稍后获得更好的性能。
Julia的软件包集合包含大多数常见数据科学或分析工作的库——常见的数学函数(如线性代数或矩阵理论)、人工智能、统计学以及用于并行计算或GPU驱动计算的工具。许多软件包都是在Julia中原生编写的,但一些包装在著名的第三方库中,如TensorFlow。如果您在共享库中有现有的C或Fortran代码,您可以以最小的开销直接从Julia调用它。
数据科学家使用交互式Jupyter笔记本环境来快速编写和共享代码。IJulia软件包在Jupyter和JupyterLab IDE中增加了对Julia代码的支持。
那么,使用Julia的缺点是什么?一个可能的问题也是Python的一大局限性:仍然没有简单的方法来捆绑Julia程序,以便没有Julia运行时的人可以使用它。存在各种变通方法,但没有一个“受祝福”的解决方案来处理整个工作流程来创建可重新分发的应用程序。
另一个问题出现在用户与Julia的学习体验的早期:“时间到第一个X”问题(也称为“时间到第一个情节”或“TTFP”)。因为Julia是JIT编译的,所以程序第一次运行时,其执行速度可能比后续运行慢得多。经验丰富的Julia用户快速了解可用于减少首次运行延迟的工具和技术。
第三个可能的障碍是,在其他语言的核心库中发现的一些常用的东西在Julia中只能作为第三方项目。例如,Python的pathlib库提供了一种面向对象的方式来处理文件路径。在Julia中,路径原生作为字符串处理,这使得一些常见的路径操作比它们需要的更复杂。
Rust
Rust是总体上最热门的新语言之一,值得注意的是,它在数据科学领域日益增长。Rust允许开发人员编写快速运行的数据科学工具,使用真正的并行性,内存安全,并避免一整类错误——所有这些功能在大规模处理数据时都很重要。
到目前为止,许多数据科学家可能已经使用了Rust开发的工具。例如,用于数据帧的ThePolars库是用Rust编写的,可用于许多其他语言,包括Python。但Rust的原生软件包集合(称为“板条箱”)也使数据科学能够直接在该语言中工作。ndarray箱提供了强大的矩阵数学工具,大致类似于Python中的NumPy。绘图仪板条箱渲染图表和图形。evcxr_jupyter项目为在笔记本环境中使用Rust提供了一个Jupyter内核。
与使用Python或Julia相比,从Rust项目生成可重新分配的二进制文件更容易,这是数据科学的一个显著优势。Rust使创建数据科学工具(如Polars)变得更容易,而不仅仅是项目。
Rust坚持正确性和内存安全既是一个有价值的特征,也是其最大的缺点。Python(有时是Julia)以执行速度换取开发速度,而Rust则相反。Rust的学习曲线比Python或Julia更陡峭,编写Rust程序可能比Python或Julia程序需要更长的时间才能正确。这使得Rust不太适合需要在短时间内进行原型化的项目,但更适合正确性和安全性更重要的工作。Rust的安全功能使其成为开发数据科学库或公共应用程序的理想选择,但对于仅供内部使用的项目来说,它可能不是您的最佳选择。
结论
由于其广泛的支持和整体能力,选择Python进行数据科学很难出错,尽管它可能需要比其他解决方案更多的工作才能成为最快或最可重新分配的选择。Julia是从头开始为数据科学而构建的,承诺(并交付)以更少的整体工作速度,但重新分配独立的Julia程序也很困难。Rust的速度和正确性是无与伦比的,这就是为什么它是许多常见数据科学工具的首选语言。对于您需要快速迭代或快速原型的项目来说,这不是最佳选择。