PyO3로 Rust code에서 Python module 사용하기

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의 디버그 모드와 릴리즈 모드의 차이가 생각보다 크게 난다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다