uvとpipの違いを比較|速度・機能・使い分けを比較表で整理

プログラミング

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

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

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

uvとpipの違い(早見表)

観点pipuv
インストールの速さ普通10〜100倍速いとされる
導入Python に標準で付いてくる別途インストールが必要
仮想環境venv を別に使うuv venv・uv sync でまとめて扱える
Python のバージョン管理pyenv など別のツールが必要になりがちuv python で対応
ロックファイルpip-tools など別のツールが必要になりがちuv.lock で管理
向いている場面入門・小さなスクリプト・「公式ツールのみ」の環境新しいプロジェクト・CI の高速化

それぞれの詳しい違いは、この後で順に見ていきます。実際に pip から uv へ乗り換える手順は「Python 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が速い理由は主に次の3つです。

  • 並列ダウンロード:依存関係の取得や処理をうまく並列化して高速化を狙っています。
  • グローバルキャッシュ:グローバルキャッシュで依存の重複を減らす設計になっています。
  • メタデータ取得の最適化:パッケージの情報(PEP 658 のメタデータ)があればそれを優先して読み、無い場合も wheel ファイル全体を落とさずに必要な部分だけを取りにいく設計になっています。

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 で読み替えると

uv には、pip とほぼ同じ感覚で使える「pip 互換モード(uv pip ...)」と、プロジェクト全体を管理する「プロジェクトモード(uv add・uv sync など)」の2つの使い方があります。よく使う操作を並べるとこうなります。

操作pipuv(pip 互換モード)uv(プロジェクトモード)
パッケージのインストールpip install requestsuv pip install requestsuv add requests
パッケージの削除pip uninstall requestsuv pip uninstall requestsuv remove requests
インストール済みの一覧pip listuv pip listuv pip list
requirements.txt から入れるpip install -r requirements.txtuv pip install -r requirements.txtuv sync
仮想環境の作成python -m venv .venvuv venv(uv sync・uv run のときに自動で作られることが多い)
Python バージョンの指定(pyenv など別のツール)uv python install 3.12uv python pin 3.12

既存の pip の手順をそのまま置き換えたいなら pip 互換モード、新しいプロジェクトを最初から 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)

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

GitHub Actions で uv を使う

uv の速さがいちばん効きやすいのが CI です。GitHub Actions では、公式のアクション astral-sh/setup-uv で uv を入れて、依存関係のインストールを uv に任せられます。

基本の設定例

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 での再現性が高まります。uv は 0.x 系でコマンドの挙動が変わることがあるため、CI では version でバージョンを固定しておくのが無難です。

キャッシュの設定

enable-cache を付けると、uv のキャッシュを GitHub Actions のキャッシュに載せられます。

      - name: Install uv
        uses: astral-sh/setup-uv@v7
        with:
          version: "0.10.2"
          enable-cache: true

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

まだAPIが変化中らしい

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

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

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

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

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

pip のほうが向いている場面もある

  • 長い実績と組織のルール:pip は長年使われてきた標準のツールなので、「公式以外のツールは使わない」という方針の職場では pip が第一候補になりやすいです。
  • 情報の多さ:uv は歴史が浅いぶん、珍しいエラーに当たったときの情報がまだ少ないことがあります。

まとめ──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前提が増えてきた気がしていて、なんとなく「知っておくと困らない時代」になってきた感じはあります。

参考になれば!

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