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 类型相互转换。
  • 双向支持 – 您可以:
    1. 用 Rust 编写 Python 模块(暴露接受/返回 NumPy 数组的 #[pyfunction]),或
    2. 从 Rust 二进制文件驱动 Python/NumPy(嵌入解释器,调用 np 函数,读取结果)。
  • 利用现有 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 代码库之间进行安全、快速的互操作。

快速入门(简单步骤)

  1. 添加到 Cargo.toml:
    [dependencies]
    pyo3 = { version = "0.30", features = ["auto-initialize"] }
    numpy = "0.30"
    
  2. 编写一个使用 numpy::{PyArray, PyReadonlyArray, IntoPyArray} 的 Rust 函数,并用 #[pyfunction] 注解。
  3. 将 crate 构建为 cdylib,并从 Python 像其他扩展模块一样导入。
  4. 或者,编写一个常规的 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;未添加任何外部假设。

相关

  • 项目
  • 项目
  • 项目
  • 项目