Installing 23 packages from a warm cache takes pip 6.6 seconds. The same install with uv takes 0.12 seconds. For a larger project - Django plus Celery plus Pandas plus scikit-learn - pip finishes in roughly 90 seconds on a cold cache. uv finishes in 8 seconds.
That speed difference is real, but it is not the main reason developers are switching. uv is a single binary that replaces five separate tools: pip, pip-tools, virtualenv, pyenv, and pipx. You stop juggling versions of multiple installers and start using one coherent tool with consistent commands.
In March 2026, OpenAI acquired Astral - the company behind uv - to integrate it into their Codex AI coding platform. Both uv and its companion linter Ruff remain MIT-licensed and actively developed in the open.
What uv Replaces
The old Python project setup looked like this:
Bashbrew install pyenv && pyenv install 3.11.0 && pyenv local 3.11.0 python -m venv .venv && source .venv/bin/activate pip install pip-tools && pip-compile requirements.in && pip-sync requirements.txt
Five tools, five config formats, five upgrade cycles. uv replaces the entire stack:
Bashuv init my-project cd my-project uv add django celery pandas scikit-learn uv run python manage.py runserver
| Old Tool | uv Equivalent |
|---|---|
pyenv install 3.12 | uv python install 3.12 |
pyenv local 3.11 | uv python pin 3.11 |
python -m venv .venv | uv venv |
pip install requests | uv add requests |
pip install -r requirements.txt | uv sync |
pip-compile requirements.in | uv lock |
pipx install black | uv tool install black |
Installation
Bash# macOS / Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # Self-update uv self update
uv is a single static binary with no Python dependency. Once installed it manages its own updates.
Core Workflows
New Project
Bashuv init my-api && cd my-api uv add fastapi uvicorn[standard] uv add --dev pytest httpx uv run uvicorn app.main:app --reload
uv add updates pyproject.toml, regenerates uv.lock, and installs into .venv in one step. No activation dance - uv run handles it transparently.
Python Version Management
Bashuv python install 3.11 3.12 3.13 uv python pin 3.12 # writes .python-version uv run --python 3.11 python --version
uv reads existing .python-version files created by pyenv, so switching from pyenv requires no file changes.
Global CLI Tools (Replaces pipx)
Bashuv tool install ruff uv tool run cowsay "Hello from uv" # run once without installing uv tool upgrade ruff
Performance
Benchmarked on a 200-package lockfile with warm cache on an M2 MacBook:
| Tool | Resolve | Install | Total |
|---|---|---|---|
| pip | 8.1s | 12.4s | 20.5s |
| Poetry | 6.2s | 9.8s | 16.0s |
| uv | 0.4s | 1.1s | 1.5s |
The speed difference is most impactful in CI/CD. A pip install step that takes 2 minutes on every push drops to 10-15 seconds with uv.
Migrating an Existing Project
From pip + requirements.txt
The uv pip subcommand is a drop-in replacement - every pip flag works identically, zero project changes required:
Bashuv pip install -r requirements.txt uv pip freeze > requirements.txt
Once comfortable, move to full project management:
Bashuv init --no-workspace uv add $(cat requirements.txt | grep -v '^#' | tr '\n' ' ')
From Poetry
uv tool install migrate-to-uv
migrate-to-uv
This converts [tool.poetry] sections to standard [project] format and generates uv.lock from your existing poetry.lock.
From pyenv
uv reads existing .python-version files unchanged. Run uv python install 3.12 once and you are done.
uv in CI/CD
yaml- name: Install uv uses: astral-sh/setup-uv@v5 with: version: "latest" enable-cache: true - name: Install dependencies run: uv sync --frozen - name: Run tests run: uv run pytest tests/ --tb=short
--frozen installs exactly what is in uv.lock without attempting updates - the right behavior for CI. enable-cache: true caches the package cache between runs, so subsequent builds complete in seconds.
When uv Falls Short
conda is not replaced. If you need non-Python dependencies (CUDA libraries, compiled C extensions), conda still handles that. uv manages PyPI packages only.
No plugin system. uv keeps it simple but is not extensible the way some pip plugins are.
Legacy setup.py packages occasionally need uv pip install --no-build-isolation.
For the vast majority of Python projects - web services, data pipelines, CLI tools, ML training scripts - uv handles everything.
Useful Tools for uv Workflows
The TOML to JSON Converter lets you inspect pyproject.toml with any JSON tool - useful when debugging dependency resolution. The YAML Formatter and YAML Validator clean up GitHub Actions workflow files. The Diff Checker makes reviewing verbose uv.lock changes in a PR much more readable.
Conclusion
uv is a full replacement for five separate tools, runs 10-100x faster, and ships as a single binary. The migration is low-risk: start with uv pip as a drop-in pip replacement, then move to uv init and uv add on your next new project. With OpenAI backing and 45k+ GitHub stars, it is infrastructure at this point.
If you are still running pip install -r requirements.txt manually, this week is a reasonable time to stop.
Related reading: Bun vs Node.js vs Deno 2 in 2026 covers the same "one fast tool replacing the old stack" story in the JavaScript ecosystem.
