始めに
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を使用しているので、実はオプションで圧縮可能だったりしたらもっと嬉しいです。
参考情報
- PyPIのminijinja
- crates.ioのminijinja