pyenv から uv に乗り換えて世界が変わった話

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に移行して、本当に良かったです。

移行して良かった理由:

  1. 時間の節約: 待ち時間がほぼゼロ
  2. ストレスフリー: インストール待ちのイライラがない
  3. シンプル: 覚えることが少ない
  4. モダン: pyproject.toml で管理
  5. 高速: とにかく速い

こんな人におすすめ:

  • 新規プロジェクトを始める人: 最初からuvで構築しよう
  • pyenvが遅いと感じている人: uvで爆速体験を
  • poetryを使ってるけど遅いと思ってる人: uvはもっと速い
  • シンプルなツールが好きな人: uvは直感的

移行の難易度:

  • 簡単さ: ★★★★★(5点満点)
  • 時間: 30分もかからない
  • リスク: pyenvと共存できるので低い

Pythonを使うすべてのエンジニアに、uvを試してみてほしいです。

一度使ったら、もう戻れなくなりますよ。


参考リンク:

次回は、uvを使った具体的なプロジェクト構築について書く予定です!