TechQuant Blog

Python uv 入門 — pip より10倍速いパッケージ管理を実戦投入した所感

7分で読める

先月、手元のRaspberry Pi 5で動かしているPythonプロジェクトの依存関係を更新しようとした。pip install -r requirements.txt を叩いて、待つこと47秒。たった12パッケージで。

「遅い」——そう感じたのは何度目だろう。venvの作成、pipのアップグレード、依存解決。毎回この儀式を繰り返すたびに、少しずつストレスが溜まっていた。

そこで試したのが uv だった。Rust製のPythonパッケージマネージャー。結果から言うと、同じ12パッケージのインストールが3.2秒で終わった。体感ではなく、実測で10倍以上速い。

ここ半年ほど実際のプロジェクトで使い込んでみて、pip + venv の組み合わせにはもう戻れないな、というのが正直な感想だ。ただし万能ではない。ハマった点も含めて書いていく。

uv とは何か——30秒で理解する

uvは Astral 社が開発しているPythonパッケージマネージャー兼プロジェクト管理ツール。同社はリンター/フォーマッターの Ruff も作っていて、「Pythonツールチェインの高速化」を一貫してやっている集団だ。

特徴を一言で言えば、pip・venv・pip-tools・pyenvがやっていたことを1つのバイナリで全部やる。しかも桁違いに速い。

Rust製なので単体バイナリとして配布されていて、Python自体がなくてもインストールできる。ここが地味にありがたい。新しいマシンをセットアップするとき「Pythonのバージョンどれ入れる問題」から解放される。

インストールと初期セットアップ

インストール(1行)

curl -LsSf https://astral.sh/uv/install.sh | sh

これだけ。macOS・Linux・WSL全部いける。Homebrew派なら brew install uv でもいい。

Raspberry Pi(ARM64)でも問題なく動く。自分の環境はRaspberry Pi 5 + Ubuntu 24.04で、インストールから使えるまで10秒かからなかった。

Pythonバージョンの管理

pyenvの代わりになる機能がuvにはある。

# 利用可能なバージョン一覧
uv python list

# Python 3.12をインストール
uv python install 3.12

# Python 3.11も並行して入れる
uv python install 3.11

pyenvと違ってビルドが不要。プリコンパイル済みバイナリをダウンロードするだけなので、ビルド依存(gcc、libffi-devとか)を入れる必要がない。Raspberry Piだとビルドに数分かかることもあったから、これは嬉しい。

プロジェクト管理——ここが本領

新規プロジェクトの作成

# プロジェクト初期化
uv init my-project
cd my-project

# 依存パッケージの追加
uv add requests fastapi uvicorn

# 開発用パッケージの追加
uv add --dev pytest ruff mypy

uv init すると pyproject.toml が生成される。requirements.txt は作られない。pyproject.toml に一本化される設計思想で、個人的にはこれが正解だと思う。

あ、もう一つ。uv add を実行すると、仮想環境の作成・パッケージのインストール・ロックファイルの更新が全部一発で走る。手動で python -m venv .venv してから pip install して……みたいな手順が消える。

生成されるファイル構成

my-project/
├── .venv/              # 自動作成される仮想環境
├── .python-version     # Pythonバージョン指定
├── pyproject.toml      # プロジェクト設定・依存関係
├── uv.lock             # 厳密なロックファイル
└── src/
    └── my_project/
        └── __init__.py

uv.lock はクロスプラットフォーム対応のロックファイルで、Linux・macOS・Windowsの依存差分もここに記録される。チーム開発で「自分の環境では動くんだけど」問題が減る。

スクリプトの実行

# 仮想環境を明示的にactivateしなくていい
uv run python main.py

# pytestもこう
uv run pytest

# ワンライナーで一時的にパッケージを使う
uv run --with pandas python -c "import pandas; print(pandas.__version__)"

uv run が便利すぎる。仮想環境のactivateを忘れて「ModuleNotFoundError」が出るあの悲しい瞬間がなくなった。

pip からの移行——既存プロジェクトはどうする

新規プロジェクトはいいとして、既存の requirements.txt ベースのプロジェクトはどうか。自分は3つのプロジェクトを移行したので、その手順を書いておく。

手順1: プロジェクトを初期化

cd existing-project
uv init

手順2: requirements.txt から依存関係をインポート

# requirements.txt の内容をそのまま追加
uv add $(cat requirements.txt | grep -v '^#' | grep -v '^$' | tr '\n' ' ')

ちなみにバージョン指定つきの行(requests==2.31.0みたいなやつ)もそのまま解釈してくれる。

手順3: 動作確認

uv run python -c "import your_main_module; print('OK')"
uv run pytest

正直、3つのうち1つはすんなりいかなかった。原因は古い setup.py しかないパッケージとの依存衝突。uv pip install コマンド(pipの互換レイヤー)で個別に対処したら解決した。ここは正直まだ試行錯誤中で、レガシーな依存が多いプロジェクトだと一筋縄ではいかないケースもある。

速度比較——数字で見る差

自分の環境(Raspberry Pi 5 / 8GB RAM)で実測した結果がこれ。

操作pip + venvuv倍率
仮想環境作成2.8秒0.1秒28倍
12パッケージinstall47秒3.2秒14.7倍
依存解決(lock)18秒1.4秒12.9倍
キャッシュ済み再install12秒0.4秒30倍

キャッシュが効いている状態だと30倍。体感としては「コマンド打った瞬間に終わる」レベル。CI/CDのパイプラインで使えばビルド時間を大幅に削れるはず。

ただし注意点がひとつ。初回のダウンロード速度はネットワーク帯域に依存するので、uv側でどうにもならない。差が出るのは依存解決・展開・リンク処理のCPU/IO部分だ。

半年使って感じた注意点

いいことばかり書いても仕方ないので、ハマったポイントも正直に。

  • エコシステムの対応状況: pyproject.toml を前提にしているので、古い setup.py のみのパッケージでたまに問題が出る。2026年時点ではかなり減ったが、ゼロではない
  • ドキュメントの日本語情報: 公式ドキュメントは英語のみ。日本語の情報はまだ少なめで、エラーメッセージをそのまま検索しても日本語記事がヒットしないことがある
  • uvx(ツール実行)の罠: uvx ruff check . のように使えるが、バージョン固定を忘れると意図しないバージョンが実行される。uvx ruff@0.4.0 check . のようにバージョン指定する癖をつけたほうがいい
  • Docker連携: マルチステージビルドとの組み合わせは快適。ただし uv.lock.dockerignore に入れないよう注意(これでハマって30分溶かした)

結局 uv に乗り換えるべきか

個人開発なら、今すぐ乗り換えていいと思う。学習コストはpipを使える人なら1時間もかからない。速度の恩恵は毎日享受できる。

チーム開発の場合は、メンバー全員のツールチェインを揃える調整が必要になるので、まずはサイドプロジェクトや新規リポジトリから試すのが現実的だ。

自分の場合、Raspberry Pi上で動くcronジョブのプロジェクトから移行を始めて、今は手元の全プロジェクトでuvを使っている。pip install のあの待ち時間がないだけで、開発中の集中力が途切れにくくなった実感がある。小さなことだけど、毎日のことだから効く。

uvの公式ドキュメント: docs.astral.sh/uv