PyO3를 이용하면 Rust에서 Python을 호출하거나 반대로 Python에서 Rust를 호출하는 바인딩을 구현할 수 있다. 이 포스팅에서는 예전에 해봤던 Datumaro로 데이터셋을 detect하는 Python함수를 Rust로 호출하는 예제를 구현해 본다.
Python 의존설 설치
Python 관련한 의존성은 예전과 같이 Datumaro를 사용하는데 필요한 것들을 설치해 준다.
pip install 'datumaro[tf,tfds]' \ tensorboardX \ tensorflow-dataset \ importlib_resources \ nibabel
Rust 의존성 crates 설정
다음과 같은 crate들이 필요하다.
- pyo3: PyO3 라이브러리
- shellexpand: ~를 절대경로로 변환하는데 사용
- tempfile: 압축 파일을 해제 해둘 임시공간 생성
- zip, tar, flate2: 압축해제
cargo add pyo3 shellexpand tempfile zip tar flate2
Rust 구현 코드
실행결과
Rust Debug – 10.9초

구현이 끝나고 돌려 봤을 때 조금 전다는 느낌이 있기는 했지만 모든 데이터셋들을 압축해제 하고 detect하는데 대략 10.9초 정도가 걸렸다.
Python vs. Rust Release
반면 Python은 3.5초 정도면 동일한 동작이 끝난다.

역시 바인딩을 위한 중간 레이어에서 뭘 많이 잡아 먹는 것일까? 하고 생각하다가 release 모드로 돌려 봤더니 결과가 확연히 좋아져서 2.5초 정도로 개선되었다.

Rust의 디버그 모드와 릴리즈 모드의 차이가 생각보다 크게 난다.