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타입과 변환합니다. - 양방향 지원 – 다음 중 하나를 할 수 있습니다:
- Rust로 Python 모듈 작성 (NumPy 배열을 받거나 반환하는
#[pyfunction]노출), 또는 - Rust 바이너리에서 Python/NumPy 구동 (인터프리터를 임베드하고,
np함수를 호출하고, 결과를 읽기).
- Rust로 Python 모듈 작성 (NumPy 배열을 받거나 반환하는
- 기존 크레이트 활용 – 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 코드베이스 간의 안전하고 빠른 상호 운용이 필요한 사람.
시작하기 (빠른 단계)
Cargo.toml에 추가:[dependencies] pyo3 = { version = "0.30", features = ["auto-initialize"] } numpy = "0.30"numpy::{PyArray, PyReadonlyArray, IntoPyArray}를 사용하는 Rust 함수를 작성하고#[pyfunction]으로 주석을 답니다.- 크레이트를
cdylib로 빌드하고 다른 확장 모듈처럼 Python에서 가져옵니다. - 또는
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에서 직접 가져온 것이며 외부 가정은 추가되지 않았습니다.
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트