未来将会有越来越多的库采用 Python 作为前端(提高编程效率)和 Rust 作为后端(提升性能)的开发模式。
Rust 正在取代 C 语言成为高性能 Python 包的"后端"
首先,让我们思考这种转变的动机。Python 编写简单,但执行速度慢是其主要问题。特别是在编写数据处理库时,由于 Python 性能较低,很难用纯 Python 开发高性能库。然而,Python 是机器学习和数据工程的主要语言。因此,当开发面向数据工程师或机器学习工程师的库时,我们会遇到以下问题:
虽然我们需要用 Python 编写 API,但高性能的数据处理任务无法仅依靠 Python 完成。这意味着在编写库时,你有以下选择:
- 要么自己学习并使用 C 语言
- 要么依赖他人编写的 C 语言库来执行底层操作
熟悉 C 语言的开发者可能会问:"这有什么问题吗?许多库作者可以将数值计算任务交给 NumPy 或 SciPy 处理。"
但实际情况并非如此理想。虽然将某些任务外包给 NumPy、SciPy 等库很方便,但这要求所有函数都必须向量化,且不能使用 for 循环编写代码。此外,还需要考虑全局解释器锁(GIL)对某些操作的阻塞,以及其他各种问题。并非所有需求都能在现有库中找到解决方案。
为什么选择 Rust?
Rust 具有与 C 语言相当的速度和内存效率,但无需手动内存管理或垃圾回收。它拥有出色的工具支持、友好的编译器和不断发展的开发者社区。使用 Rust 不仅能提升程序性能,还能在学习过程中结识更多同道中人。
最重要的是,对 Python 开发者而言,Rust 比 C 语言更容易学习:
- 改善了"入门级"体验,使初学者更容易编写"安全"的代码
- 学习曲线更平缓,允许开发者随时间逐步掌握更高级的语言特性
实际应用案例
1. Lance:高性能、低成本的向量数据库
创始人 Chang She 和 Lei Xu 最初使用 C++ 编写代码库,但当他们不再需要处理 CMake 时,决定转向 Rust。Chang 表示:"从 C++ 转向 Rust 的决定源于我可以更高效地工作,在不损失性能的同时,也不必处理 CMake。我们用了大约 4 个月的时间用 Rust 重写了之前的 C++ 代码,每次用 Rust 编写和发布新功能时,我们都更加确信不会遇到段错误。"
2. Pydantic:面向开发者的 Python 验证库
Pydantic 团队用 Rust 重写了第二个版本,即使是简单模型也实现了 20 倍的性能提升。除了性能改进外,Rust 还带来了其他优势。Pydantic 创始人 Samuel Colvin 指出:"Rust 编写的代码通常更易于使用和维护。特别是 Rust 能捕获和处理所有可能的错误,而 Python(和 TypeScript)的类型系统往往会忽略这些错误。"
未来展望
展望未来,越来越多的库将采用 Python 作为前端、Rust 作为后端的开发模式。总的来说,当今的 Python 开发者在构建高性能库时,拥有了更好、更流畅的开发方式。