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
通过 PyO3 将 Rust 与 Python 集成
\n\nPyO3 是连接 Rust 和 Python 最流行的方法。您用 Rust 编写函数,将其编译成本地模块(.so 或 .pyd),然后像普通的 Python 模块一样导入。听起来很神奇?实际上很简单。
\n\n安装与配置
\n首先,安装 maturin — 用于构建 Rust Python 扩展的工具:
pip install maturin\n创建一个新项目:
\nmaturin init --bindings pyo3\n这将创建一个包含 Cargo.toml 和 lib.rs 文件的结构。
示例:加速计算
\n假设我们需要快速计算斐波那契数列。用 Python 可能很慢,但用 Rust 则快如闪电。以下是 src/lib.rs 中的代码:
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构建模块:
\nmaturin develop\n现在在 Python 中:
\nimport rust_fib\nprint(rust_fib.fibonacci(40)) # 102334155\n与纯 Python 比较速度 — 差异可达数十倍!这是用于优化的 Rust 与 Python 集成 的完美示例。
\n\n传递复杂数据
\nPyO3 不仅支持数字,还支持列表、字典甚至 numpy 数组。例如,可以传递一个列表并在 Rust 中处理它:
\n#[pyfunction]\nfn sum_list(numbers: Vec<i32>) -> i32 {\n numbers.iter().sum()\n}\n在 Python 中:
\nprint(rust_fib.sum_list([1, 2, 3, 4])) # 10\n这为数据科学和 Web 开发中的 Rust 与 Python 集成 开辟了巨大的可能性。
\n\nRust 和 C:经典的 FFI
\n\nRust 被设计为 C/C++ 的替代品,因此 Rust FFI 是其原生特性