最近、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でも「pipやpip-tools、pipx、poetry、pyenv、virtualenvなどを置き換える単体ツール」みたいな立ち位置が明言されています。 (github.com)
従来のPython開発って、こういう感じで複数ツールを使い分ける必要がありました。
- パッケージ管理 →
pip - 仮想環境の作成 →
venvやvirtualenv - 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.toml と uv.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 run や uv 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前提が増えてきた気がしていて、なんとなく「知っておくと困らない時代」になってきた感じはあります。
参考になれば!

