きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Rust製のPythonライブラリは軽いと思ってた

始めに

pydantic等のPythonのライブラリはコア部分がRustで書かれていて、Pythonでも十分な処理速度が確保されている、という表現をされることがあります。

そのため、基本的にはRustで作られたライブラリに移行しようとして、テンプレートエンジンのjinja2からminijinjaに移行しようとしました。その過程で気付いたことをメモするだけの記事です。

※ Pythonのminijinjaについては、試験的な試みでminijinja単体の機能が完全に移行されているわけではないし、処理速度も早いとかは明記されていないので、現時点で移行は勧めないです。

minijinja-py is an experimental binding of MiniJinja to Python

環境

  • Python
    • 3.13
  • jinja2
    • 3.15
  • minijinja
    • 1.63

まとめ

  • Rust製ライブラリは処理速度面で優位なことが多い
  • Rust単体でビルドしたときはバイナリファイルにされるので軽い
  • Pythonとの互換性を持たせたサイズが大きいので、総合的にはサイズが大きくなりがち

気付いたこと

jinja2からminijinjaのサイズを確認するときに気付きました。

uv pip list --format freeze | awk -F = {'print $1'} | grep -E 'jinja2|minijinja' | xargs uv pip show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk '{print $2 "/" tolower($1)}' | xargs du -sh 2> /dev/null | sort -hr
2.1M    /products/fastapi-practice/.venv/lib/python3.13/site-packages/minijinja
536K    /products/fastapi-practice/.venv/lib/python3.13/site-packages/jinja2

コマンドの実行結果を見て分かるとおり、jinja2は536k程度にもかかわらず、minijinjaは2.1Mもサイズがあります。具体的にどこのファイルが大きいかというと、Rust製ライブラリのコア部分です。

# ls -ltrah
-rw-r--r--   2 hiroto hiroto  238 Nov 17 23:38 _lowlevel.pyi
-rw-r--r--   2 hiroto hiroto  558 Nov 17 23:38 _internal.py
-rw-r--r--   2 hiroto hiroto 5.1K Nov 17 23:38 __init__.pyi
-rw-r--r--   2 hiroto hiroto 5.3K Nov 17 23:38 __init__.py
-rwxr-xr-x   2 hiroto hiroto 2.1M Nov 17 23:38 _lowlevel.abi3.so

ちなみに、Rustのcrates.ioを見ると分かるのですがRust上で使用する場合は156KB程度です。

また、会社で使用しているFastAPIプロジェクトをPython3.13にアップデートしようとしたら、Docker Imageのサイズが1GBくらいまで膨らんでしまいました。Python3.12でも800MBくらいになっています。

終わりに

Rustの高速な処理能力とPythonの豊富なライブラリエコシステムを使用できることは喜ばしいのですが、Dockerのイメージサイズがどんどん大きくなっていくのが困りますね。正直、感覚的にサイズ大きいと感じているだけではあるので、1GBとかが当たり前であるならそれはそれでよいのですが…。

もしPythonのプロジェクトをDockerのイメージ化する際に、イメージサイズをダイエットさせる方法があれば教えていただきたいです。実運用上はECRを使用しているので、実はオプションで圧縮可能だったりしたらもっと嬉しいです。

参考情報