
pyenv から uv に乗り換えて世界が変わった話
「Python 3.12のインストール、まだ終わらないの...?」
pyenvでPythonをインストールする度に、コーヒーを淹れに行く時間ができました。5分、10分待つのが当たり前。
でも、uvに出会ってから、全てが変わりました。
インストールが一瞬で終わる。パッケージ管理も爆速。仮想環境の作成も秒で終わる。
「pyenv使ってる場合じゃないな」と確信し、完全移行を決めました。
uvとの出会い:衝撃の速さ
uvは、Rustで書かれたPythonのパッケージマネージャー&プロジェクトマネージャーです。
最初に見たときは、「また新しいツールか...」と半信半疑でした。Pythonの環境管理ツールって、毎年のように新しいのが出てきますよね。pyenv、poetry、pipenv、conda...もういい加減疲れてた。
でも、試してみて驚愕しました。
速い。とにかく速い。
なぜそんなに速いのか
uvがRustで書かれているのは、ただのこだわりじゃありません。
Rustの特性:
- ゼロコストの抽象化: 高レベルなコードなのに低レベルと同じ速度
- 並列処理: マルチコアを最大限活用
- メモリ安全: クラッシュしない
これらがすべて、「爆速」につながっています。
uvができること(全部入り)
従来のPython開発では、複数のツールを組み合わせる必要がありました:
pyenv → Pythonバージョン管理
venv → 仮想環境
pip → パッケージ管理
pip-tools → 依存関係のロック
uvは、これ全部を1つでやってくれます。
- Pythonバージョン管理: pyenvの代わり
- 仮想環境: venvの代わり
- パッケージ管理: pipの代わり
- 依存関係ロック: pip-toolsの代わり
- プロジェクト管理: pyproject.tomlベースの管理
オールインワン。これがめちゃくちゃ快適なんです。
移行手順:意外と簡単だった
「pyenvから移行するの面倒そう...」と思ってたんですが、全然そんなことなかったです。
ステップ1: uvのインストール(1行)
curl -LsSf https://astral.sh/uv/install.sh | sh
これだけ。1行で終わり。
インストール後、シェルを再起動するか、パスを通します:
# .zshrc に追加されるので、再読み込み
source ~/.zshrc
# バージョン確認
uv --version
ステップ2: Pythonのインストール(秒で終わる)
pyenvでPython 3.12をインストールすると、5〜10分かかりました。ソースからビルドするので仕方ない。
uvは違います。
# Python 3.12 をインストール
uv python install 3.12
実行してから、気づいたら終わってます。30秒くらい。
「え、もう終わったの?」って二度見しました。
インストール済みのバージョンは、こうやって確認:
uv python list
cpython-3.12.7-macos-aarch64-none /Users/xxx/.local/share/uv/python/...
cpython-3.11.9-macos-aarch64-none /Users/xxx/.local/share/uv/python/...
複数バージョンも管理できます。pyenvと同じですね。
ステップ3: プロジェクトでの使用
既存のプロジェクトに、uvを導入してみます。
# プロジェクトディレクトリへ移動
cd ~/projects/my-awesome-project
# Python バージョンを指定(プロジェクト単位)
uv python pin 3.12
# .python-version ファイルが作成される
cat .python-version
# → 3.12
pyenvの.python-versionと同じ仕組みなので、安心。
次に、依存関係をインストール:
# requirements.txt がある場合
uv pip install -r requirements.txt
# または、pyproject.toml がある場合
uv sync
uv syncは、依存関係を解決して、仮想環境も自動で作ってくれます。便利すぎ。
pyenvとの比較:圧倒的な差
実際に使ってみて、違いを表にまとめました。
| 項目 | pyenv + venv + pip | uv |
|---|---|---|
| インストール速度 | 5-10分(ビルド) | 30秒(バイナリ) |
| パッケージインストール | 遅い(10秒〜) | 超速(1-3秒) |
| ツール数 | 3つ必要 | 1つで完結 |
| 設定の複雑さ | 中程度 | シンプル |
| ロックファイル | 手動(pip-tools) | 自動(uv.lock) |
| 並列処理 | なし | あり |
| メモリ効率 | 普通 | 優秀 |
結論: uvの圧勝です。
実際の速度比較
具体的にベンチマークを取ってみました。
テスト環境:
- MacBook Pro M1
- Django + 依存パッケージ約50個
結果:
pip install -r requirements.txt
→ 28.3秒
uv pip install -r requirements.txt
→ 2.1秒(約13倍速)
最初、計測ミスったかと思いました。でも、何度やっても同じ。
uvが圧倒的に速い。
実際に使ってみた感想
良かった点
1. インストールが本当に速い
もうこれに尽きます。「待つ」というストレスがゼロ。
特に、新しいプロジェクトを立ち上げるときの快適さが違います。
# 新規プロジェクト作成
uv init my-new-project
cd my-new-project
# Python 指定
uv python pin 3.12
# パッケージ追加
uv add django fastapi pandas
# もう開発開始できる(全部で30秒)
この流れが30秒で終わります。以前は5分以上かかってました。
2. コマンドが直感的
pyenv、venv、pipを組み合わせると、コマンドが複雑になります:
# pyenv + venv + pip の場合
pyenv install 3.12.0
pyenv local 3.12.0
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
pip freeze > requirements.txt # ロックファイル的な
uvだと、こうなります:
# uv の場合
uv python install 3.12
uv python pin 3.12
uv sync
シンプル。覚えることが少ない。
3. pyproject.toml でモダンな管理
requirements.txtじゃなくて、pyproject.tomlで管理できるのが嬉しい。
[project]
name = "my-project"
version = "0.1.0"
dependencies = [
"django>=5.0",
"fastapi>=0.100",
]
[tool.uv]
dev-dependencies = [
"pytest>=8.0",
"ruff>=0.1",
]
これで、本番用と開発用の依存関係を明確に分けられます。
4. 自動でロックファイル
uv syncを実行すると、uv.lockファイルが自動で生成されます。
これがあると:
- 全員が同じバージョンの依存関係を使える
- 再現性が高い
- 「僕の環境では動くんだけど...」がなくなる
poetryのような体験が、もっと速く手に入ります。
イマイチな点
正直に言って、あんまり不満はないんですが、強いて言えば:
1. 情報がまだ少ない
2024年に正式リリースされたばかりなので、日本語の情報が少ないです。
StackOverflowで検索しても、pyenvの情報ばかり。uvの記事は少ない。
ただ、公式ドキュメントは充実してるので、英語が読めれば問題なし。
2. 一部のツールとの互換性
CIツールやデプロイ環境で、uvがまだサポートされてないケースがあります。
例えば、GitHub Actionsで使う場合:
# setup-python は pyenv ベース
- uses: actions/setup-python@v4
with:
python-version: '3.12'
# uv を使うには別途インストールが必要
- name: Install uv
run: curl -LsSf https://astral.sh/uv/install.sh | sh
まあ、これは時間が解決する問題かな。
3. エディタの統合
VSCodeやPyCharmが、uvの仮想環境を自動認識しないことがあります。
手動で指定すれば動くんですが、ちょっと手間。
# VSCode の場合、仮想環境のパスを指定
# .venv/bin/python
この辺も、今後改善されるでしょう。
pyenvをアンインストールするか問題
移行後、pyenvをアンインストールするか悩みました。
結論: しばらく共存させることにしました。
理由:
- 既存プロジェクトがpyenvベースで動いている
- チームメンバーがまだpyenvを使っている
- トラブったときの保険
ただ、新規プロジェクトはすべてuvで作成しています。
徐々に移行して、最終的にはpyenvを削除する予定。
他のPythonツールはどうなる?
poetry は?
poetryも優秀なツールです。依存関係管理がとても良い。
でも、uvの速さを知ってしまうと、戻れない...
poetryのpoetry installは20秒くらいかかるけど、uvのuv syncは2秒。
この差は大きい。
pipenv は?
pipenvは、もう使ってないので比較できません。
でも、pipenvよりはuvの方が速いはずです(Rust製なので)。
conda は?
condaは別の用途(データサイエンス、非Python依存関係)で使うツールなので、共存できます。
プロジェクトによって使い分ければOK。
まとめ:もう戻れない
pyenvからuvに移行して、本当に良かったです。
移行して良かった理由:
- 時間の節約: 待ち時間がほぼゼロ
- ストレスフリー: インストール待ちのイライラがない
- シンプル: 覚えることが少ない
- モダン: pyproject.toml で管理
- 高速: とにかく速い
こんな人におすすめ:
- 新規プロジェクトを始める人: 最初からuvで構築しよう
- pyenvが遅いと感じている人: uvで爆速体験を
- poetryを使ってるけど遅いと思ってる人: uvはもっと速い
- シンプルなツールが好きな人: uvは直感的
移行の難易度:
- 簡単さ: ★★★★★(5点満点)
- 時間: 30分もかからない
- リスク: pyenvと共存できるので低い
Pythonを使うすべてのエンジニアに、uvを試してみてほしいです。
一度使ったら、もう戻れなくなりますよ。
参考リンク:
次回は、uvを使った具体的なプロジェクト構築について書く予定です!