uv pip 徹底比較:pipとどっちを使うべきか整理してみる

プログラミング

最近、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 installuv pip installに置き換えるだけでいいので、まずそこから始めてみるのがおすすめです。参考になれば!

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

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