PyO3/rust-numpy
PyO3-based Rust bindings of the NumPy C-API
它是什么
rust‑numpy 是一个 Rust 库,允许您从 Rust 调用 NumPy 的 C‑API,并且还可以将 Rust 函数暴露为 Python 模块。实际上,它连接了两个生态系统:您可以编写与 NumPy 数组配合的高性能 Rust 代码,也可以用 Rust 编写 Python 扩展。
为什么重要
- 速度与安全 – Rust 提供零成本抽象和内存安全保证,同时能够操作 NumPy 使用的相同
ndarray结构。 - 无缝互操作 – 无需手动指针操作;该 crate 提供了安全包装器(
PyArray、PyReadonlyArray等),可与 Rust 的ndarray类型相互转换。 - 双向支持 – 您可以:
- 用 Rust 编写 Python 模块(暴露接受/返回 NumPy 数组的
#[pyfunction]),或 - 从 Rust 二进制文件驱动 Python/NumPy(嵌入解释器,调用
np函数,读取结果)。
- 用 Rust 编写 Python 模块(暴露接受/返回 NumPy 数组的
- 利用现有 crate – 基于
PyO3用于 Python 绑定,ndarray用于 Rust 端矩阵处理。
核心功能(如 README 所述)
| 功能 | 您获得的内容 |
|---|---|
| NumPy C‑API 绑定 | 直接访问 NumPy 数组,无需复制数据。 |
| 安全 Rust 包装器 | 类型如 PyArrayDyn<T>、PyReadonlyArrayDyn<T>、IntoPyArray,以及借用方法(as_array、as_array_mut)。 |
| 自动转换 | 通过 into_pyarray 和 as_array 在 ndarray::Array* 和 NumPy 数组之间转换。 |
| 示例 | 简单模块(axpy、mult)以及嵌入 Python 调用 np.absolute 的示例。 |
| 并行与线性代数支持 | 示例项目展示了使用 rayon 进行并行和 ndarray‑linalg 进行 BLAS/LAPACK 操作。 |
| 版本兼容性 | 支持 Rust ≥ 1.85、Python ≥ 3.9、NumPy ≥ 1.16,以及一系列 ndarray 版本(0.15‑0.17)。 |
谁适合使用
- 数据科学/机器学习开发者,希望用 Rust 编写性能关键的核,但保持在熟悉的 Python/NumPy 工作流中。
- Rust 开发者,构建 Python 扩展(例如自定义 NumPy ufunc、快速预处理步骤)。
- 研究人员,需要在 Rust 算法和现有 Python 代码库之间进行安全、快速的互操作。
快速入门(简单步骤)
- 添加到
Cargo.toml:[dependencies] pyo3 = { version = "0.30", features = ["auto-initialize"] } numpy = "0.30" - 编写一个使用
numpy::{PyArray, PyReadonlyArray, IntoPyArray}的 Rust 函数,并用#[pyfunction]注解。 - 将 crate 构建为
cdylib,并从 Python 像其他扩展模块一样导入。 - 或者,编写一个常规的
fn main(),调用Python::with_gil(|py| { … })从 Rust 运行 Python 代码。
限制/注意事项(来自 README)
- 您必须在目标 Python 环境中安装兼容的 NumPy。
- 该 crate 重新导出了
ndarray;如果您依赖不同版本的ndarray,可能需要使用cargo update手动统一版本。 - 在最近的版本(0.29/0.30)中,已放弃对 Python 3.7/3.8 的支持。
社区与贡献
- 欢迎在 GitHub 上提交问题和拉取请求。
- 该项目遵循 PyO3 的贡献指南,并有一个 Gitter 频道供讨论。
以上所有信息均直接取自仓库的 README;未添加任何外部假设。
相关
- 项目
- 项目
- 项目
- 项目