PyO3/rust-numpy

PyO3-based Rust bindings of the NumPy C-API

무엇인가

rust‑numpy는 Rust에서 NumPy의 C‑API를 호출할 수 있는 Rust 라이브러리이며, Rust 함수를 Python 모듈로 노출할 수도 있습니다. 실제로 두 생태계를 연결합니다: NumPy 배열과 함께 작동하는 고성능 Rust 코드를 작성할 수 있고, Rust로 Python 확장을 작성할 수 있습니다.

왜 중요한가

  • 속도와 안전성 – Rust는 제로 비용 추상화와 메모리 안전성을 보장하면서 NumPy가 사용하는 동일한 ndarray 구조를 조작할 수 있습니다.
  • 원활한 상호 운용 – 수동 포인터 조작이 필요 없습니다. 이 크레이트는 안전한 래퍼(PyArray, PyReadonlyArray 등)를 제공하여 Rust의 ndarray 타입과 변환합니다.
  • 양방향 지원 – 다음 중 하나를 할 수 있습니다:
    1. Rust로 Python 모듈 작성 (NumPy 배열을 받거나 반환하는 #[pyfunction] 노출), 또는
    2. Rust 바이너리에서 Python/NumPy 구동 (인터프리터를 임베드하고, np 함수를 호출하고, 결과를 읽기).
  • 기존 크레이트 활용 – Python 바인딩을 위해 PyO3, Rust 측 행렬 처리를 위해 ndarray를 기반으로 합니다.

핵심 기능 (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) 및 np.absolute를 호출하기 위한 Python 임베딩 예제.
병렬 및 선형대수 지원 예제 프로젝트는 병렬 처리를 위해 rayon, BLAS/LAPACK 연산을 위해 ndarray‑linalg를 사용.
버전 호환성 Rust ≥ 1.85, Python ≥ 3.9, NumPy ≥ 1.16, 그리고 다양한 ndarray 버전(0.15‑0.17) 지원.

누가 사용할까

  • 데이터 과학/ML 개발자 – 성능이 중요한 커널을 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. 크레이트를 cdylib로 빌드하고 다른 확장 모듈처럼 Python에서 가져옵니다.
  4. 또는 Python::with_gil(|py| { … })를 호출하는 일반적인 fn main()을 작성하여 Rust에서 Python 코드를 실행합니다.

제한 사항/주의 사항 (README에서)

  • 대상 Python 환경에 호환되는 NumPy 설치가 필요합니다.
  • 이 크레이트는 ndarray를 재내보냅니다. 다른 ndarray 버전에 의존하는 경우 cargo update로 수동으로 버전을 통합해야 할 수 있습니다.
  • 최근 릴리스(0.29/0.30)에서 Python 3.7/3.8 지원이 중단되었습니다.

커뮤니티 및 기여

  • GitHub에서 이슈와 풀 리퀘스트를 환영합니다.
  • 이 프로젝트는 PyO3의 기여 지침을 따르며 토론을 위한 Gitter 채널이 있습니다.

위의 모든 정보는 저장소의 README에서 직접 가져온 것이며 외부 가정은 추가되지 않았습니다.

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트