pipとuvを比較してみた──Python入門者にも試せる爆速パッケージ管理ツール「uv」、乗り換えどき?

プログラミング

最近、AIツールのドキュメントを読んでいたら「uvを使ってインストールしてください」という手順がやたら出てくるようになっていて。「あ、これもう無視できないやつだ」と思って調べ始めました。そもそも自分、pip installに特に不満もなかったんですよね。でもuv触ってみたら、正直「なんで今まで気にしなかったんだろう」ってなってしまいました。

この記事では、PythonのpipとuvをPython入門者向けに比較しながら、uvの基本的な使い方をまとめています。「uvって聞いたことあるけどよくわからない」という人の参考になれば嬉しいです。

  • uvとは何か、なぜ注目されているのか
  • pipとuvの速度・機能の違い
  • uvのインストール方法(Windows / Mac / Linux)
  • uvの基本コマンド(インストール・仮想環境・プロジェクト管理)
  • pipからの移行時に知っておきたいこと
  • どちらを使うべきかの個人的な考え

uvって何者なのか

uvは、Astralが開発しているPython向けのパッケージ&プロジェクト管理ツールです。READMEでも「pippip-toolspipxpoetrypyenvvirtualenvなどを置き換える単体ツール」みたいな立ち位置が明言されています。 (github.com)

従来のPython開発って、こういう感じで複数ツールを使い分ける必要がありました。

  • パッケージ管理 → pip
  • 仮想環境の作成 → venvvirtualenv
  • Pythonバージョンの切り替え → pyenv
  • CLIツールの管理 → pipx
  • 依存関係の固定 → pip-tools

これ、最初に全部セットアップするの地味に面倒なんですよね。uvはそれらをまとめて面倒を減らす方向で設計されています(もちろん「全部完全に置き換えられるか」は、チームの運用や要件次第なところもあります)。 (github.com)

Rustで作られているのがポイント

uvの最大の特徴は、内部実装にRustを採用していること。Rust製で高速、というのは公式のREADMEでも前面に出ています。 (github.com)

余談ですが、最近Rustで書かれたツールがPython周辺に増えてきた気がします。ruffとかもそうですよね。パフォーマンスが必要な部分をRustで、というのが流行っているのかも。

pipとuvの速度比較──数字で見ると驚く

uvが一番インパクトを与えるのは、この速度の差だと思います。

公式の主張としては「pipより10〜100倍速い」が分かりやすいラインです(環境・依存関係・キャッシュ状況でブレます)。 (github.com)

実際の計測例として、JupyterLabをインストールした場合の比較がこちら:

# pip でインストール
$ time python -m pip install jupyterlab
→ 約 21.4秒

# uv でインストール
$ time uv pip install jupyterlab
→ 約 2.6秒

こういう数字はマシン・回線・OS・キャッシュ状態で全然変わるので、「自分の環境だとどのくらい?」はぜひ一回だけでも測ってみるのが早いです(自分はベンチ取る前にテンションで導入しがちで、そこはちょっと反省してます)。

なぜこんなに速いのか

仕組みを少し掘り下げると、uvが速い理由は主にふたつです。

  • 並列ダウンロード:依存関係の取得や処理をうまく並列化して高速化を狙っています。
  • グローバルキャッシュ:グローバルキャッシュで依存の重複を減らす設計になっています。

pipが「1本の水道から順番に水をくむ」イメージなら、uvは「複数の水道から同時にくむ」イメージ、という表現が個人的にしっくりきました。

uvのインストール方法(Windows / Mac / Linux)

uvは、Pythonが入っていない環境でも(スタンドアロンのインストーラ経由で)導入できるのが特徴のひとつです。 (github.com)

macOS / Linux

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

Windows(PowerShell)

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

インストール後はターミナルを再起動し、以下で動作確認できます。

uv --version
# 例: uv 0.x.x

Homebrew派の人は brew install uv でも入ります。 (docs.astral.sh)

uvの基本コマンドを使ってみる

uvはpipコマンドと似た構文なので、pip経験があれば比較的すんなり入れると思います。

パッケージのインストール(pipライクな使い方)

uvにはpip互換インターフェースがあり、uv pip ... でpipっぽく使えます。 (github.com)

# 基本インストール
uv pip install requests

# 複数パッケージをまとめて
uv pip install pandas numpy matplotlib

# バージョン指定
uv pip install "django==4.2.0"

# requirements.txtからまとめてインストール
uv pip install -r requirements.txt

uv pip install は「pip互換の低レベル操作」寄りです。プロジェクトの依存をちゃんと管理したい場合は、環境を手でいじるより uv add を使うのが推奨されています(手動で uv pip install すると再現性が崩れる可能性があるよ、というニュアンスです)。 (docs.astral.sh)

仮想環境の作成

仮想環境もuvひとつで作れます。

# .venv という仮想環境を作成
uv venv

# Pythonバージョンを指定して作成
uv venv --python 3.11

# 有効化(Mac/Linux)
source .venv/bin/activate

# 有効化(Windows)
.venv\Scripts\activate

uvで作られる仮想環境は普通のvenvなので、従来の手順とも共存できます。あとuvは uv run を使う前提だと「毎回activateしない」運用もしやすいです(activateしないと落ち着かない派もいるので、このへんは好み)。 (docs.astral.sh)

プロジェクト管理モード(uv init / uv add)

uvの真骨頂はプロジェクト管理機能だと思います。poetryやryeに近い使い方で、pyproject.tomluv.lock を使って再現可能な環境を作れます。 (github.com)

# プロジェクトの初期化(pyproject.tomlが生成される)
uv init myproject
cd myproject

# パッケージの追加(pyproject.toml と uv.lock に反映)
uv add requests
uv add "pandas>=2.0"

# パッケージの削除
uv remove requests

# スクリプトの実行(仮想環境を自動で使う)
uv run main.py

# ロックファイルから完全再現インストール
uv sync

uv add が便利なのは、あらかじめ仮想環境を作成して入っておく必要がない点です。uv runuv sync 実行時に環境を作ったり最新状態にしたりしてくれます。 (docs.astral.sh)

「仮想環境に入り忘れたままpip installを実行してしまい、システム全体にインストールしてしまった!」というPython入門あるあるを避けやすいのは、地味にありがたいです。自分も割とやりがちなので。

Pythonバージョンの管理

uv python pin.python-version ファイルを作って、以後uvがPythonバージョン解決するときの手がかりにします。pyenvなしでPython本体のインストール・切り替えも可能です。 (docs.astral.sh)

# 指定バージョンのPythonをインストール
uv python install 3.12

# プロジェクトで使うバージョンを固定(.python-version が作られる)
uv python pin 3.11

# インストール済みのPythonを確認
uv python list

pip vs uv 比較まとめ表

ここまでの内容を整理するとこんな感じです。

機能 pip + venv uv
インストール速度 普通 10〜100倍速い(とされる)
仮想環境管理 別途 venv コマンド uv venv で統合
Pythonバージョン管理 別途 pyenv が必要になりがち uv python で対応
ロックファイル pip-tools 等が別途必要になりがち uv.lock(uv管理)
pip互換コマンド ✅(uv pip〜)
Python標準搭載 ❌(別途インストール)
一時実行(pipxライク) ❌(pip本体にはない) ✅(uvx / uv tool run)

アンインストール時の挙動の違い

地味に便利なのが、アンインストール時の動作です。uvは直接依存を削除すると、関連する依存パッケージ(transitive dependencies)も一緒に削除してくれる挙動になります。一方でpipはそれらを残し続けます。 (realpython.com)

長期間開発していると不要なパッケージが積み重なって環境が汚れがちなので、これは地味にありがたいです。

uvを使う上で知っておきたいこと

まだAPIが変化中らしい

uvは0.x系でまだ積極的に開発が進んでいて、サブコマンドやフラグが更新されることがあります。CI/CDで使う場合は、インストーラで特定バージョンを指定するなど、バージョン固定しておくのが安全寄りかなと。 (docs.astral.sh)

一部パッケージでビルドが失敗することがある

C拡張を使ったパッケージなどで、環境によってはビルドがコケることはあります(これはuvに限らずですが…)。その場合、まずは「ビルドに必要なOS側の依存が入ってるか」を確認しつつ、pip互換オプション(例:--no-build-isolation)を試す、みたいな順序が現実的だと思います。

Python公式の標準ツールではない

uvはPython公式の標準ツール(標準ライブラリ)ではなく、サードパーティツールです。組織の方針によっては採用しにくいケースもあるかもしれません。個人開発や小規模チームなら問題ないと思いますが、大きな組織での導入はひと確認入れたほうがよさそうです。

まとめ──pipとuvどちらを使うべきか

  • uvはRust製・統合型ツールで、pipより10〜100倍速いとされる (github.com)
  • pip互換モード(uv pip install)があるので、既存のワークフローを大きく変えずに試せる (github.com)
  • 仮想環境管理・Pythonバージョン管理・ロックファイルまでuvひとつで完結できる (github.com)
  • uv add / uv run / uv sync でpoetryライクなプロジェクト管理も可能 (github.com)
  • まだバージョンが活発に更新中なので、CI/CDではバージョン固定が無難 (docs.astral.sh)
  • pipはPython標準搭載で枯れたツール。シンプルなスクリプトやPython入門の段階では今でも全然アリ

個人的には「新しいプロジェクトを始めるならuvをまず検討、既存のpip環境は無理に全部変えなくてもいいか」くらいの温度感で使っています。CI/CDの環境構築が速くなるのは分かりやすいメリットなので、そこは特に刺さるかもしれません。

最近、AIツール周辺の手順でもuv前提が増えてきた気がしていて、なんとなく「知っておくと困らない時代」になってきた感じはあります。

参考になれば!

参考になったらクリックしてもらえると嬉しいです!

Blogmura ProgrammingProgramming Ranking
タイトルとURLをコピーしました