最近、Python環境を新しく作るたびに「uvって使ったほうがいいよな…」という気持ちになりつつも、ずっとpipでなんとかしてきました。でもGitHub Actionsのインストール待ち時間がじわじわ気になってきて、ついに本腰入れて調べることにしました。
実際に両方使ってみて、uv pip 徹底比較として、コマンドの対応関係や速度差、移行の手間など自分なりにまとめておきます。「uvって名前は聞いたことあるけど結局何が違うの?」という人の参考になれば。
- uvとpipそれぞれの特徴と設計思想の違い
- 速度・機能面での具体的な差
- よく使うコマンドの対応表
- uvへの移行手順(requirements.txt → pyproject.toml)
- uvを使うべきケース・pipで十分なケース
- GitHub ActionsでのCI/CD活用パターン
uvとpipって何が違うの?まず基本から
pipはPythonに標準で付属するパッケージ管理ツールで、長年Pythonエコシステムを支えてきた存在です。一方uvは、Astral社が開発している比較的新しいツールです(PyPI上だと少なくとも2024年2月末には0.1系のリリースが見えます)。
uvの特徴を一言で言うと
「Rust製・単一バイナリ・オールインワン」 のパッケージ&プロジェクトマネージャーです。
具体的に何ができるかというと:
- パッケージのインストール・アンインストール(pip の代替)
- 仮想環境の作成・管理(venv / virtualenv 相当の体験をまとめる)
- 依存関係のロックファイル管理(uv.lock を使った lock / sync)
- Pythonバージョン自体のインストール・切り替え(uv python install / pin)
- スクリプト単位での依存関係管理
- ツールのグローバルインストール(uvx 経由で pipx 的に使う)
つまりpipだけでなく、これまで複数のツールを組み合わせてやっていたことをuvひとつで完結させようというコンセプトです。余談ですが、自分もpyenv + venv + pip + pip-toolsをあわせて使っていた時期があって、「これ全部uvに替えられるの…?」と最初は信じられませんでした。
速度差はどのくらい?pip vs uvを実際に比べると
uvの売りのひとつが速さなのは確かです。ただ、「初回8〜10倍・2回目以降80〜100倍」みたいな数値は環境や条件でブレやすいので、記事中で”目安”として扱うのが安全かなと(ベンチの条件が揃ってないと誤解されやすいやつ)。
なぜ速いのか、主な理由は以下のとおりです:
- 並列ダウンロード:pipが基本1本ずつ進めがちなのに対して、uvは並列に取ってきます。
- グローバルキャッシュの活用:CI含めて、キャッシュが効くと速くなりやすいです(どのくらい効くかはプロジェクト次第)。
- メタデータ取得の最適化:PEP 658のメタデータがある場合はそれを優先し、ない場合はHTTP rangeリクエストでwheelのZIP全体を落とさずに必要部分だけ読みにいく、という設計になっています。
- Rust実装:速さに寄与はしますが、言語より設計の寄与が大きい(並列やrange取得は他言語でも実装可能)というのも納得感あります。
コマンド対応表:pip vs uvの読み替えガイド
uvはpip互換のインターフェース(uv pip ...)を提供していますが、pipの全オプション・全サブコマンドを完全に網羅しているわけではない点は注意です(足りないものは順次実装されてる雰囲気)。
基本操作の対応
| 操作 | pip | uv(pip互換モード) | uv(プロジェクトモード) |
|---|---|---|---|
| パッケージインストール | pip install requests |
uv pip install requests |
uv add requests |
| パッケージ削除 | pip uninstall requests |
uv pip uninstall requests |
uv remove requests |
| インストール済み一覧 | pip list |
uv pip list |
uv pip list |
| requirements.txtからインストール | pip install -r requirements.txt |
uv pip install -r requirements.txt |
uv sync |
| 仮想環境作成 | python -m venv .venv |
uv venv |
(uv sync / uv run などで必要に応じて作られる運用が多い) |
| Pythonバージョン指定 | (pyenvなど別ツール) | uv python install 3.12 |
uv python pin 3.12 |
uvには「pip互換モード(uv pip ...)」と「プロジェクトモード(uv add / uv syncなど)」の2種類の使い方があります。既存のpipワークフローをほぼそのまま使いたいなら前者、新規プロジェクトを最初からuvで管理するなら後者が向いています。
プロジェクト初期化の流れ
新規プロジェクトをuvで始める場合はこんな感じです:
# プロジェクトの初期化(pyproject.toml が作成される)
uv init my-project
cd my-project
# パッケージの追加(pyproject.toml に記録 + uv.lock が生成される)
uv add requests pandas
# 開発用依存の追加(dependency groups に入る)
uv add --dev pytest ruff
# 環境の同期(uv.lock に基づいて .venv を構築)
uv sync
# スクリプトの実行(仮想環境を activate しなくてもOK)
uv run python main.py
uv run が地味に便利で、わざわざ source .venv/bin/activate しなくても仮想環境上でコマンドを実行できます。activate忘れで「あれ、パッケージが見つからない」みたいなミスが減ります。
pipとuvの機能比較まとめ
uvが優れている点
- 速さ:並列ダウンロード+キャッシュで体感差が出やすい(特にCI)
- オールインワン寄り:pip互換インターフェースに加えて、プロジェクト管理(lock/sync)やPython管理(install/pin)まで含めて一括で触れる
- ロックファイル(uv.lock):
uv lock/uv syncを使うと、依存関係を固定して環境差を減らしやすい - Pythonバージョン管理込み:コンテナ内などでも、uv経由でPythonを入れる運用ができる(ただしCIでは
actions/setup-pythonのほうが速いケースもあるので状況次第) - アンインストール時の挙動:プロジェクトモードの
uv removeは、不要になった推移的依存も一緒に片付けてくれる(pipのuninstallは基本残りがち)
pipが優れている点・uvで注意すべきこと
- 安定性と実績:長年の運用実績がある。組織のポリシー上「公式以外はNG」という環境ではpipが第一選択になりやすい
- uvはまだ0.x系:0.x系の間はサブコマンドや挙動が変わる可能性があるので、CIではバージョン固定が無難
- pip完全互換ではない:
uv pipはpipのサブセット対応で、未対応オプションもある(踏むとハマるので、既存CIの置き換えは段階的が安全) - 情報の少なさ:pipより歴史が浅いぶん、エッジケースの知見はまだ少なめなことがある
pipからuvへ移行する手順
既存プロジェクトでrequirements.txtを使っていて、uvに乗り換えたい場合の流れです。
uvのインストール
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windowsの場合
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# インストール確認
uv --version
requirements.txt → uvプロジェクトへの移行
# 既存の pip 環境から依存関係を書き出す(まだ pip を使っている場合)
pip freeze > requirements.txt
# uvでプロジェクトを初期化
uv init
# requirements.txt の内容を一括でインポート(uv add は -r 対応)
uv add -r requirements.txt
# ロックファイルを生成して環境を同期
uv sync
poetryやryeをすでに使っていてpyproject.tomlがある場合は、まずuv syncから試すのが手堅いです(既存の定義を読んで環境を作ってくれます)。
pip互換モードで使いたい場合
既存のrequirements.txt管理をそのまま引き継ぎつつ、速さだけ享受したい場合はpip互換モードが便利です:
# 仮想環境を作成
uv venv .venv
source .venv/bin/activate # macOS/Linux
# requirements.txtからインストール(コマンドはpipにそっくり)
uv pip install -r requirements.txt
# インストール済みパッケージを書き出す
uv pip freeze > requirements.txt
この使い方であれば、既存のワークフローをほぼ変えずにインストール速度だけ改善できます。
GitHub ActionsでuvをCI/CDに使う
個人的にuvを使い始めた一番の理由はここで、CIのインストール待ち時間が結構バカにならないんですよね。
基本的なActionsの設定例
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# uv のセットアップ(公式アクション)
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
version: "0.10.2" # CIは"範囲指定"より、まずはピン留めが安全
# Python のインストールも uv に任せる(好みで actions/setup-python でもOK)
- name: Set up Python
run: uv python install 3.12
# 依存関係のインストール
- name: Install dependencies
run: uv sync --frozen
# テスト実行
- name: Run tests
run: uv run --frozen pytest
--frozenフラグを使うとuv.lockの内容を変更せずにそのままインストールするため、CIでの再現性が高まります。
キャッシュの設定
setup-uvのenable-cacheを使うと、uvのキャッシュをGitHub Actions Cacheへ載せる設定ができます:
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
version: "0.10.2"
enable-cache: true
あと地味に大事なのが、setup-uv側はgithub-token入力も用意されていて、バージョン取得やダウンロードでGitHub APIを叩く部分のレート制限対策にもなります(デフォルトは${{ github.token }})。「latest指定が即NG」という話はケースバイケースなので、困ったらまずログを見てトークン周りを疑うのがよさそうです。
uv pip 徹底比較:結局どちらを使うべきか
個人的な結論をまとめると、こんな感じです:
- 新規プロジェクトを始める:uvを試す価値はかなり高い。
uv initから始めてプロジェクトモードで管理すると体験がいい - 既存プロジェクトへ段階的に導入:まず
uv pip互換モードで速さだけ享受 → 余裕があればpyproject.toml移行、が現実的 - CI/CDの高速化が目的:uvは特にここで効果が出やすい。インストール待ちが長いパイプラインほど恩恵がある
- 長期運用の社内プロダクション:uvはまだ0.x系なので、組織の判断次第。pipを主軸にしつつ様子見でもいいかもしれない
- レガシー環境や長期サポート:pipは安定と互換の砦。レガシープロジェクトや長期サポート環境では依然として第一選択肢になりやすい
自分はDockerベースのLambda関数とGitHub Actionsを結構使っているので、そこへの導入は正直めちゃくちゃ体験がよかったです。「Pythonが入っていない空のDockerイメージでもuvだけで環境構築が完結する」というのは、Lambdaコンテナイメージを作るときに地味にうれしいポイントです(もちろん用途次第ですが)。
まとめ
- uvはRust製・Astral社開発の高速Pythonツールで、pip互換の
uv pipと、プロジェクト管理(uv add/uv sync)の両方を提供している - 速度は環境差が出るので数値は”目安”扱いが安全。ただ、並列化とキャッシュでCIが速くなるパターンは多い
- pip互換モード(
uv pip install)で既存ワークフローをほぼそのまま高速化できる - プロジェクトモード(
uv add/uv sync)を使うとuv.lockによる再現性も取りやすい - GitHub Actionsではastral公式アクション(
astral-sh/setup-uv)とキャッシュを組み合わせると効果が出やすい - まだ0.x系のため、CI環境ではバージョン固定が無難。pip互換も”完全一致ではない”点は意識しておく
「とりあえず速さだけ試してみたい」ならpip installをuv pip installに置き換えるだけでいいので、まずそこから始めてみるのがおすすめです。参考になれば!

