アダコテック技術ブログ

アダコテックのエンジニアが発信する技術ブログです

技術ブログ素案:「Poetry から uv へ——開発体験はどう変わるのか?」

はじめに

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 の“次のデファクト”になる可能性が高いツールだと思います。