Rust 作为粘合剂:与 Python、C 及其他语言的集成

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust 作为通用粘合剂:为什么与其他语言集成是一种超能力

\n\n

您是否曾梦想用 Rust 编写一个高性能模块,但又不想将整个项目重写为 Python?或者,您可能需要为旧的 C 库添加安全的内存管理?欢迎来到 Rust 与其他语言集成的世界。在这里,Rust 不仅仅是一种独立的语言,更是一种强大的“粘合剂”,连接着不同的生态系统。

\n\n

在 pythonlib.ru 上,我们经常谈论 Python,但今天我们要做一个有趣的转变。Rust 不仅速度快、安全性高,而且具有令人难以置信的灵活性。它能够通过 PyO3 与 Python 集成,通过 FFI 调用 C 函数,甚至编译成 WebAssembly 在浏览器中运行。在本文中,我们将分析三种主要场景,展示实际代码,并提供实用建议。我们开始吧!

\n\n

为什么要将 Rust 与其他语言集成?

\n\n

想象一下:您有一个庞大的 Python 项目,由于循环而运行缓慢。您可以用 Rust 重写关键部分,获得 10-100 倍的速度提升,同时无需改动其余代码。或者,您正在处理一个遗留的 C 库,并希望将其封装在一个安全的 Rust 接口中。由于 外部函数接口 (FFI),Rust 非常适合此目的。

\n\n

集成的主要原因:

\n
    \n
  • 性能 — Rust 在计算密集型任务中比 Python 和 JavaScript 更快。
  • \n
  • 安全性 — Rust 可防止内存泄漏和数据竞争,这对 C/C++ 至关重要。
  • \n
  • 生态系统 — 您无需离开原生语言即可访问 Rust 库。
  • \n
  • WebAssembly — Rust 代码在浏览器中以接近原生的速度运行。
  • \n
\n\n

通过 PyO3 将 Rust 与 Python 集成

\n\n

PyO3 是连接 Rust 和 Python 最流行的方法。您用 Rust 编写函数,将其编译成本地模块(.so 或 .pyd),然后像普通的 Python 模块一样导入。听起来很神奇?实际上很简单。

\n\n

安装与配置

\n

首先,安装 maturin — 用于构建 Rust Python 扩展的工具:

\n
pip install maturin
\n

创建一个新项目:

\n
maturin init --bindings pyo3
\n

这将创建一个包含 Cargo.toml 和 lib.rs 文件的结构。

\n\n

示例:加速计算

\n

假设我们需要快速计算斐波那契数列。用 Python 可能很慢,但用 Rust 则快如闪电。以下是 src/lib.rs 中的代码:

\n
use pyo3::prelude::*;\n\n#[pyfunction]\nfn fibonacci(n: u32) -> u64 {\n    match n {\n        0 => 0,\n        1 => 1,\n        _ => fibonacci(n - 1) + fibonacci(n - 2),\n    }\n}\n\n#[pymodule]\nfn rust_fib(_py: Python, m: &PyModule) -> PyResult<()> {\n    m.add_function(wrap_pyfunction!(fibonacci, m)?)?;\n    Ok(())\n}
\n

构建模块:

\n
maturin develop
\n

现在在 Python 中:

\n
import rust_fib\nprint(rust_fib.fibonacci(40))  # 102334155
\n

与纯 Python 比较速度 — 差异可达数十倍!这是用于优化的 Rust 与 Python 集成 的完美示例。

\n\n

传递复杂数据

\n

PyO3 不仅支持数字,还支持列表、字典甚至 numpy 数组。例如,可以传递一个列表并在 Rust 中处理它:

\n
#[pyfunction]\nfn sum_list(numbers: Vec<i32>) -> i32 {\n    numbers.iter().sum()\n}
\n

在 Python 中:

\n
print(rust_fib.sum_list([1, 2, 3, 4]))  # 10
\n

这为数据科学和 Web 开发中的 Rust 与 Python 集成 开辟了巨大的可能性。

\n\n

Rust 和 C:经典的 FFI

\n\n

Rust 被设计为 C/C++ 的替代品,因此 Rust FFI 是其原生特性

博客

书籍推荐