Rust-for-Python-Developers--Why-You-Should-Take-a-Look-at-the-Rust-Programming-Language
Rust for Python Developers: Why You Should Take a Look at the Rust Programming Language
在这篇文章中,我将向您展示为什么作为 Python 开发者,也值得看看 Rust,以及这两种编程语言之间的差异。我们还将构建一个简单的示例,展示如何在两种语言中打开 CSV 文件,以说明编程中的差异。
什么是 Rust——为什么每个人都谈论它?
Rust 是一种现代系统编程语言,由 Mozilla 于 2010 年创建,旨在实现 C & C++的好处,如安全性和性能,同时避免典型的缺陷。这些编程语言通常必须处理内存泄漏、空指针异常或混乱的语法。自从其发明以来,Rust 发展迅速,现在越来越受欢迎,尤其是在性能方面超过了像 Python 这样的传统编程语言。
Rust 编程语言的基础是,你对计算机的内存管理和资源拥有最大程度的控制,同时还能创造一个愉快的开发者体验,在这种体验中,资源不需要像在 C 语言中那样手动分配。相反,Rust 使用所谓的所有权模型,这可以在编译时防止许多错误类。简而言之,这是通过编译器检查一系列规则来实现的,如果违反了其中一条规则,编译过程就会终止。
对于许多程序员来说,这个过程是新的,因为他们习惯于使用那些要么进行垃圾回收,要么必须显式分配和释放内存资源的编程语言。
这种独特特性使得 Rust 编程语言非常适合那些性能和速度至关重要的应用,例如操作系统、网络服务器或处理大量数据。
什么是编译?
如果你来自 Python 世界,你习惯于编写代码然后简单地执行它。这是因为 Python 是一种所谓的可解释语言,它逐行执行代码,并在执行过程中将其转换为机器代码,然后由计算机执行。因此,可以轻松快速地创建原型,但这也导致了性能损失,尤其是在重复计算或大量数据的情况下。
另一方面,Rust 是一种编译语言,在代码执行之前由所谓的编译器将其转换为原生机器代码。这是一种可以直接由处理器理解的二进制代码。这个过程被称为编译。
编译有以下优点:
-
速度:由于代码在运行时不会编译,因此它可以执行得更快,类似于 C 或 C++。
-
早期错误检测:在编译过程中,代码不仅被编译,还会同时检查许多错误,例如类型安全或内存错误。
-
作为二进制文件分发:编译后,结果可以作为独立的
.exe或.bin文件传递,无需解释器或依赖项。
对于许多来自 Python 的开发者来说,这一步最初可能不太寻常,也可能导致一些挫败感。然而,这对于 Rust 的性能优势至关重要。
Rust 的特别之处在哪里?
-
编译与高性能:在 Rust 中,代码在执行之前被转换为机器代码,可以直接由计算机理解,无需先由解释器或虚拟机转换。这个过程与 C 或 C++ 中已经熟悉的过程相同。这为你提供了真正的性能优势,因为中间层被移除,代码可以直接在机器上运行,这可以带来真正的性能优势,尤其是在计算密集型过程中。
-
无需垃圾回收器的内存安全:与其他语言,如 Java 或 Python 相比,Rust 不使用垃圾回收器,它会在后台自动运行并释放不再需要的内存。另一方面,所有权模型 可以确保内存及时释放,并且不会产生任何性能损失,因为它已经在编译过程中执行,并且确切地知道程序执行时在何时需要哪个内存空间。这防止了以下错误:
-
在编程语言中,空指针异常发生在变量可以具有空值
null的情况下。如果尝试访问这样的变量,程序通常会崩溃。然而,在 Rust 中,没有空值,因为这些必须用类型 Option 显式标记。 -
在不同线程中并行处理数据时,如果两个线程都访问相同的数据并写入数据,则可能会发生错误。这可能导致不可控的行为和数据错误,通常被称为竞态条件。另一方面,Rust 只允许同时进行单个修改访问(
&mut)和多个读取访问(&)。这意味着写操作永远不会同时发生,从而防止了错误。 -
如果一个变量已经被释放或删除,而程序随后仍然尝试访问它,则可能会发生use-after-free 错误,这可能导致安全漏洞甚至程序崩溃。如果 Rust 中的变量超出了有效范围,内存将自动释放,程序将无法再访问它。如果确实发生这种情况,编译器将终止,不允许程序编译。
-
-
现代工具:Rust 嵌入了一个复杂的生态系统,其中以
cargo工具为中心。它管理所有对代码重要的过程,例如创建新项目、管理外部依赖项或编译代码。这种“一站式工具”允许你专注于实际代码,无需处理配置问题或构建脚本。 -
高接受度与广泛社区:Rust 已被 Stack Overflow 社区连续多年评为“最受欢迎”的编程语言。该社区也以其开放性、详细的文档和易于初学者使用而闻名。它还积极参与进一步的发展。
Rust 与 Python – 有何不同?
Rust 和 Python 是两种非常不同的编程语言,可以用于类似的应用,但在基本结构上存在重大差异。Python 因其快速原型设计和简单的语法而特别受用户欢迎,而 Rust 则提供高性能和控制。具体来说,这两种语言在以下方面有所不同:
| 属性 | Python | Rust |
|---|---|---|
| 类型化 | 不需要指定类型,例如整数或字符串 | 必须静态声明类型 |
| 速度 | 解释型,尤其是循环慢 | 由于编译和优化而非常快 |
| 内存使用 | 垃圾收集器在数据不再需要时释放存储空间 | 无终止监控的拥有模型 |
| 多线程 | 可能实现简单的多线程,但由于全局解释器锁而速度较慢 | 快速且安全,没有全局解释器锁,因此可以实现真正的并行处理 |
| 入门 | 简单直观的语言,拥有庞大的社区 | 学习曲线陡峭,但非常有益且安全 |
| 错误处理 | 代码中必须拦截异常,否则系统将崩溃 | Result类型是显式且安全的(无异常) |
| 语法 | 高级,非常易读且简单 | 严格,但现代且富有表现力 |
如表格所示,这两种编程语言主要在类型和由此依赖的执行速度上有所不同。由于其语法,Python 提供了一个简单的编程语言入门途径,并可用于原型设计,而 Rust 则是性能密集型系统的理想选择,但学习曲线较陡峭。
为什么 Rust 对 Python 开发者来说如此吸引人?
如果你来自 Python 世界,你通常习惯于在高层次抽象级别上工作,因为你可以使用像 Pandas 或 NumPy 这样强大的库,很少需要担心内存管理,并且只需几行代码就可以实现复杂的程序。这正是 Python 的优势所在,但有时你可能会达到其极限,例如当你想要进一步优化性能或编写真正的并行程序时。在这些情况下,Rust 就派上用场了,它可以作为一个令人兴奋的补充,用于 Python。
更多控制
在 Rust 中,你会遇到诸如内存管理、所有权和生命周期等概念,因为变量必须被特别类型化,并且一些错误在编译期间就已经被识别。如果你来自纯 Python 世界,一开始可能会觉得这非常紧张且不必要,但实际上正好相反。通过实际处理变量及其内存使用,你可以更好地理解自己的代码,并识别直接的优化潜力。这种知识不仅对 Rust 有用,而且还能提升你在开发中的技能。
高性能
对于可能需要高度并行化的计算密集型任务,由于全局解释器锁(GIL)的存在,Python 很快就会达到其极限,因为真正的并行性被阻止了。使用 Rust,可以避免这些瓶颈,并实现高性能模块,例如用于数据分析或图像处理。借助 PyO3 或 FFI 等库,这些模块可以直接集成到 Python 项目中。这样,Python 的简单性与 Rust 的性能就可以结合起来。
Rust 用于后端
除了模块之外,还可以使用 Rust 编写整个微服务或命令行工具。它们的特点是稳健,并且几乎不需要外部依赖。此外,可以使用 actix-web 或 axum 编写强大的 API,这些 API 可以用于机器学习模型或数据处理管道,例如。例如,可以在 Rust 中构建一个 CSV 解析器、一个预处理模块和一个高吞吐量 API 网关,然后简单地使用 Python 进行编排。
Rust 与 Python 的结合
如前几节所示,Rust 和 Python 并不是相互竞争,而是可以美妙地结合,使得能够以强大而简单的方式实现非常复杂的应用程序。因此,对于许多 Python 开发者来说,将 Rust 包含在他们的工具集中并在适当的地方使用它是很有意义的。
现在我们已经了解了 Rust 的特殊功能,深入探讨开发和比较两种编程语言中的两个具体项目是有意义的。
比较示例:Python 和 Rust 中的项目
为了对两种语言有一个具体的印象,在本节中,我们将查看一个简单但实用的任务,这个任务在数据科学领域经常出现。它涉及首先打开一个 CSV 文件,然后确定文件中的行数。
在 Python 中,我们加载内置的 Python csv 模块,该模块包含用于处理 CSV 文件的大量函数。然后可以打开 data.csv 文件,并通过变量 f 传递。csv.reader(f) 然后生成一个读取器,将 CSV 中的每一行解析为 Python 列表,随后所有读取的行都转换为列表。最后,这个列表的长度对应于 CSV 文件中的行数:
import csv
with open('data.csv') as f:
reader = csv.reader(f)
rows = list(reader)
print(len(rows))
总体而言,这段代码编写速度快,也易于阅读和理解。然而,这个实现会将整个文件读入内存,这可能导致处理大文件时出现问题。此外,没有真正的错误处理,例如,如果文件在预期文件夹中找不到。
相反,在 Rust 中,我们首先导入一个错误接口,以便能够处理各种错误。我们还使用 csv::Reader; 作为导入 CSV 文件的外部包。实际工作发生在 main 函数中,它输出 OK(()) 或错误(如果成功)。首先打开文件。命令末尾的 ? 表示任何可能发生的错误,例如文件缺失,都会传递。然后读取并计数所有条目。然后使用 println! 将数据记录数输出到控制台:
use std::error::Error;
use csv::Reader;
fn main() -> Result<(), Box<dyn Error>> {
let mut rdr = Reader::from_path("data.csv")?;
let count = rdr.records().count();
println!("Zeilen: {}", count);
Ok(())
}
由于其广泛的错误处理,这个程序非常健壮,不会在出现问题时简单地崩溃。它还节省内存,因为 CSV 文件是逐行读取的,这有很多优点,尤其是在处理大文件时。
Rust 在数据科学领域有哪些亮点?
Rust 最初是一种用于“系统”或“硬件相关”开发的编程语言,可用于性能应用开发。然而,近年来,它也已成为数据处理的一个强大选择。特别是与 Python 结合使用时,例如,以下用例出现:
-
使用 Polars 进行数据预处理:Polars 是一个在两种语言中都在发展的库,可以用作 Pandas 的替代品,用于处理大数据集。它最初是在 Rust 中开发的,但也可以从 Python 中使用。借助多线程、延迟评估和按列可执行性,可以比 Pandas 中的类似过程快十倍处理大量数据。
-
PyO3 中的计算密集型任务:对于 Python 中的需求型应用,如文本解析、图像处理或数据验证,代码的部分可以简单地外包给 Rust。然后,这些部分可以直接通过 PyO3 或 maturin 作为 Python 模块集成。这在数据预处理管道中尤其有用,最终将处理后的数据传递给 TensorFlow。
-
使用 actix-web 的 Web 后端:对于 API 和微服务,Rust 提供了 actix-web,这是一个高性能框架,不仅比 Flask 或 FastAPI 更快,而且更安全,因为没有运行时错误,并且使用了静态类型。
这是你应该带在身边的
如果你……,Rust 对你来说是有价值的。
-
你想要进行更多底层编程,并且不想经历 C/C++的困难。
-
你喜欢使用 Python,但在某些方面存在性能限制。
-
你想要开发后端服务或 CLI 工具。
-
你想要更好地理解程序如何与内存以及系统的其他部分交互。
-
你想要编写健壮且易于维护的工具,它们只需运行即可。

浙公网安备 33010602011771号