はじめに
Python のパッケージ管理は、この数年で大きく進化しました。
長らく定番だった pip + venv、その後登場した Poetry。
そして今、急速に存在感を増しているのが Astral 社の uv です。
「uv はとにかく速い」という声を聞き、私も遅ればせながら乗り換えを始めました。
実際に使ってみると、想像以上に 速い・軽い・シンプルでした。
本記事では、uv の紹介と「速い」という視点でpoetryとの比較をまとめたいと思います。
uv とは?
uv は、Astral(旧 Astral.sh / Rye チーム)が開発する超高速 Python ツールチェーンです。
uv さえあれば、Python 開発でよく使う以下を 一つの CLI に集約できます:
- パッケージ管理(pip / Poetry)
- 仮想環境管理(venv / pyenv)
- Python 本体のインストール(pyenv / ASDF)
- スクリプト実行(pipx / rye)
Python 開発で「ツールが増えすぎる問題」を解決するのが uv の本質です。
uv の強み
1. とにかく高速
uv のコアは Rust で実装されており、処理がとにかく軽いです。
- 依存解決
- ダウンロード
- インストール
- 仮想環境の作成
- Python 本体のインストール
いずれも、従来の pip / Poetry に比べて明確に高速です。
2. pip 互換で標準準拠(PEP621)
uv は pip 互換 を第一に設計されているため:
- 既存プロジェクトに導入しやすい
- Poetry のような独自仕様が少ない
pyproject.tomlを素直に使える
という強みがあります。
3. Python 本体まで面倒を見る
pip や Poetry では扱えない Python 本体(3.9, 3.10, 3.11…)も uv で管理できます。
uv python install 3.11 uv venv
これにより、pyenv・ASDF が不要になります。
4. キャッシュ管理が非常に優秀
- wheel キャッシュ
- ソースダウンロード
- 依存解決の結果
などを非常に効率よく再利用します。
そのため、
- 二回目以降のインストール
- CI/CD
- ローカルでの環境作り直し
で大きな差が生まれます。
実験:uv と Poetry の速度比較
5試行の平均時間から、uvとPoetryの速度比較を行います。
まず、仮想環境作成比較として下記コマンドの実行速度を比較しました。
poetry env use python uv venv --clear --python "C:\ProgramData\anaconda3\python.exe"
次にパッケージインストールの実行比較として下記コマンドの実行速度を比較しました。
パッケージインストールの速度比較はキャッシュが無い状態でのインストール(はじめてのインストール)とキャッシュありの状態でのインストール(再インストール)の両方を評価しています。
poetry install --no-root --no-interaction uv sync --no-install-project --python "C:\ProgramData\anaconda3\python.exe"
また、依存パッケージとして下記の様なtomlを用意しました。
############################## # Poetry 用の設定 ############################## [tool.poetry] name = "benchmark-heavy" version = "0.1.0" description = "Medium-heavy dependency benchmark for Poetry vs uv" authors = ["Adacotech"] [tool.poetry.dependencies] python = ">=3.10,<4.0" # 科学技術系(やや重い) numpy = "*" scipy = "*" pandas = "*" matplotlib = "*" scikit-learn = "*" seaborn = "*" # ビルドが必要なもの(uv が有利になりやすい) opencv-python = "*" pyarrow = "*" # Web 系 fastapi = "*" uvicorn = "*" pydantic = "*" # 実用的な軽量パッケージ群 requests = "*" tqdm = "*" Pillow = "*" joblib = "*" [tool.poetry.group.dev.dependencies] pytest = "*" black = "*" flake8 = "*" ############################## # uv 用(PEP621) ############################## [project] name = "benchmark-heavy" version = "0.1.0" requires-python = ">=3.10" dependencies = [ "numpy", "scipy", "pandas", "matplotlib", "scikit-learn", "seaborn", "opencv-python", "pyarrow", "fastapi", "uvicorn", "pydantic", "requests", "tqdm", "Pillow", "joblib", ] [project.optional-dependencies] dev = [ "pytest", "black", "flake8", ] ############################## # ビルドシステム ############################## [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api"
実験1:仮想環境作成速度
5 回計測の実測値:
| ツール | 記録(sec) | 平均 |
|---|---|---|
| Poetry | 1.62 / 1.15 / 1.13 / 1.11 / 1.09 | 約 1.22 秒 |
| uv | 0.03 / 0.03 / 0.03 / 0.03 / 0.03 | 約 0.03 秒 |
uv は uv venv で仮想環境作成を単独で実行できるため、
純粋な venv の作成時間を比較すると 0.03 秒程度でした。
→ uv の方が 約 40〜50 倍速い。
実験2:パッケージのインストール(キャッシュなし)
| ツール | 実測(sec) |
|---|---|
| Poetry | 40–83 秒(約 57.6 秒平均) |
| uv | 29–39 秒(約 35.6 秒平均) |
今回のプロジェクト構成では、
✨ uv の方が明確に速い
という結果になりました。
理由:
- uv は依存解決を極めて高速に実行
- wheel の準備も並列化が強い
- Rust 実装による I/O 効率の高さ
特に pyarrow・opencv のような重いパッケージがある場合、
uv の高速ダウンロード・準備が効いてきます。
実験3:パッケージのインストール(キャッシュあり)
過去の計測結果では:
| ツール | 再インストール時間 |
|---|---|
| Poetry | 約 3.24 秒 |
| uv | 約 1.10 秒 |
→ uv は Poetry の約 3 倍速い。
キャッシュありの再インストールは、
uv の得意領域で圧倒的な差が出ます
まとめ:uv は「初回から速い」「2回目はもっと速い」
あらためてuvの特徴と今回の実験結果についてまとめます。
🔥 uv の強みまとめ
- 仮想環境作成が圧倒的に速い(秒 vs 分)
- 依存解決が高速
- 並列ダウンロードが強い
- Python 本体まで管理できる
- PEP & pip 互換で扱いやすい
- キャッシュ再利用が秀逸(CI とローカルで効く)
🧪 今回の実測まとめ(キャッシュなし)
- 仮想環境作成:uv の方が速いが、poetryでもまったく問題ない
- パッケージインストール(キャッシュなし):uv の方が1.6倍程度速い
- パッケージインストール(キャッシュあり):uv は 3 倍高速とキャッシュ無しの状態より高速化が進んだ
最後に
Poetry から uv に移行すると、
- 環境構築が軽くなる
- インストールが速くなる
- Python / pip / venv / pyenv の複雑さから解放される
- CI/CD が速くなる
というメリットを実感できます。
uv は、Python の“次のデファクト”になる可能性が高いツールだと思います。