PyO3로 파이썬 안에서 Rust 돌리기: 경계를 넘는 비용은 파싱보다 크다
- Rust 코드를 파이썬으로 가져오는 4단계는 일반 Rust 모듈 작성, #[pyfunction]·#[pymodule] 매크로 부착, maturin이 크레이트를 .so/.dylib/.dll로 컴파일해 가상환경에 넣기, 그다음 import다.
- 예제인 JSON 파서는 Rust enum JsonValue 트리를 만든 뒤 into_pyobject로 트리 전체를 파이썬 객체로 다시 짓는다. 값 10만 개짜리 문서면 경계에서 약 10만 개 파이썬 객체가 생성돼 파싱 자체보다 이 변환이 전체 시간을 지배할 수 있다.
- 작성자의 Rust 강좌 수강생 결과로 Josh 버전은 실제 fixture에서 CPython의 C json 모듈을 이겼고, Jochen 버전은 파이썬 구현보다 최대 3.5배 빨랐다.
- 파싱 실패는 From for PyErr 구현 하나로 경계를 넘어 ValueError로 raise되며 오류 위치(position)가 보존된다. Pydantic v2의 pydantic-core도 같은 PyO3 툴체인으로 만든 Rust 확장이다.
- 댓글에서는 Pyodide에서 PyO3 확장이 안 돌 수 있다는 우려가 대부분 해결됐다는 반응과 함께, 글 자체가 AI가 쓴 강좌 홍보 슬롭이라는 비판이 나왔다.
Hacker News opinions
pip install로 Rust로 짠 도구를 배포하는 데 잘 씀. 생물학 도구처럼 파이썬 사용자가 주로 쓰는 것들. Maturin이 manylinux 바이너리를 자동으로 만들어줘서 Linux ABI 지옥도 피할 수 있고.
Pyodide 걱정은 이제 거의 해결됐어. PyPI에 Rust나 C 확장의 WASM 빌드를 올릴 수 있고, pydantic_core도 그렇게 배포돼 있음.
PyO3는 그냥 네이티브 C 코드 감싸는 것과 비슷한 거 아닌가. 예전부터 있던 방식이고, Pyodide는 브라우저 쪽 얘기 같은데 왜 걱정했는지 모르겠음. 서버에서 WASM 파이썬 돌리려면 그냥 WASM 타깃으로 빌드된 파이썬 쓰는 게 훨씬 간단했음.
근데 그렇게 쉽진 않았음. 실제로 PyO3 지원 붙이는 데 꽤 애먹었고 블로그 글도 따로 있을 정도임.
첫 문장부터 AI 냄새 난다는 건 좀 이상함. AI치고는 너무 어색하고 읽다가 자꾸 걸림. 독일어 화자가 쓴 것 같은 문장 구조도 있고 필수적으로 보이는 연결어가 빠져 있음. 저품질 모델이거나 사람이 손댄 글 같음.
파이썬이 도는 모든 곳에서 이게 돌아가나? 임베디드 환경에서 Rust 툴체인 못 쓰고 빌드 타깃도 없으면 어떻게 됨?
그 경우엔 안 됨. 근데 Rust 타깃 지원이 내 경험상 훨씬 넓어서 별로 문제 안 될 듯. GPOS 없는 플랫폼도 됨.
파이썬도 파이썬이 도는 모든 곳에서 안 돌아감. 그래서 요즘은 스크립트 언어보다 바이너리로 컴파일되는 언어로 기우는 중임. 아키텍처만 맞으면 언어를 설치할 필요가 없으니까.
C 대신 왜 Rust냐면 그냥 일반적으로 Rust가 나아서임. 안전성, 인체공학 같은 것. C 쓰고 싶으면 쓰면 되고. 기존 Rust 라이브러리를 쓰고 싶을 때도 있음.
Rust를 실행하는 게 아니라 Rust 컴파일러로 컴파일한 기계어를 실행하는 것임. numpy가 C나 Fortran인 것과 같음. 파이썬의 원래 장점이 그거고. 글은 그냥 Rust 강좌 팔려는 AI 슬롭 같음.
한 가지 다른 건 PyO3가 더 안전하고 쓰기 쉬워서, 예전엔 이 방식으로 만들 가치가 없던 모듈까지 만들게 된다는 점임.
이제 HN에서 도메인 차단 기능부터 만들어야 할 때임. 슬롭이 통제가 안 됨. 첫 몇 문장에서 이미 머리가 아픔.
기존 PyPI 생태계 중에 패키지 저자가 WASM을 따로 신경 안 쓰고도 이렇게 돌아가는 게 얼마나 될까?
Rust가 C/C++보다 크로스 컴파일이 잘 돼 있어서 WASM 지원은 오히려 더 쉬움. IO 쓰는 패키지는 어렵지만 그건 C 라이브러리도 마찬가지고, Tokio는 아직 안 되는데 epoll 기반 지원이 진행 중임.
이건 WASM 얘기지만, PySide6로 Qt 프론트를 쓰고 백엔드를 Rust로 두는 식으로도 가능함. Qt용 Rust 바인딩을 안 만들어도 됨.