TL;DR
Astral reports uv at 10–100x faster than pip. Its own published benchmarks show uv about 2x faster than Poetry on a cold install and roughly 10x or more on warm installs and lock file resolution. After OpenAI’s March 2026 agreement to acquire Astral, uv also has the strongest corporate backing of any Python packaging tool. If you’re starting a new project today, use uv. If you’re publishing a library and your team already knows Poetry, it still works fine. pip is the fallback you’ll never fully escape, and that’s okay.
Last updated: September 2026 — uv 0.12.x, Poetry 2.4.x, pip 26.2.
uv vs Poetry: Head-to-Head
If you’re here because you’re deciding between uv and Poetry specifically, this section is for you. pip is a different category: it’s a package installer, not a project manager. uv and Poetry are the two tools that actually compete for the same job: managing your Python project end to end.
Install Speed: uv vs Poetry
Astral’s BENCHMARKS.md times four scenarios against the same real-world dependency set (Trio’s docs requirements), with Poetry, PDM and pip-tools as the comparison. The results are published as bar charts; these are the approximate values read off them:
| Scenario | uv | Poetry | PDM | pip-tools |
|---|---|---|---|---|
| Warm install | ~0.06 s | ~0.9 s | ~1.8 s | ~3.8 s (pip-sync) |
| Cold install | ~1.1 s | ~2.5 s | ~2.1 s | ~7.2 s (pip-sync) |
| Warm resolution | ~0.01 s | ~0.6 s | ~2.0 s | ~1.2 s (pip-compile) |
| Cold resolution | ~0.4 s | ~3.5 s | ~3.2 s | ~4.0 s (pip-compile) |
The cold install is the honest number for a CI job with no shared cache: uv is about twice as fast as Poetry there, because both spend most of the time downloading. Once the cache is warm, or the job is resolution, the gap becomes an order of magnitude or more. These are Astral’s numbers from one macOS machine, and a vendor benchmark is still a vendor benchmark, so read them as shape rather than a guarantee.
The reasons for the gap are architectural and well documented:
| Factor | uv | Poetry |
|---|---|---|
| Written in | Rust, ships as a standalone binary | Python |
| Resolver | PubGrub-based, compiled | PubGrub-based, interpreted |
| Package cache | Global cache, linked into each venv | Wheel cache, unpacked into each venv |
| Python interpreter | Downloads and manages its own | Needs one already installed |
Large dependency trees with loose version constraints are where the resolver difference shows most. The only benchmark that should settle it for your team is one on your own lockfile, and it takes a minute to set up with hyperfine:
# Warm-cache install from each tool's lockfile, 5 runs each
hyperfine --runs 5 --prepare 'rm -rf .venv' \
'uv sync --frozen' \
'POETRY_VIRTUALENVS_IN_PROJECT=true poetry install --no-root'
Feature Comparison: uv vs Poetry
Both tools handle the core workflow: dependency management, lockfiles, virtual environments, and publishing. Where they diverge is scope.
| Feature | uv | Poetry |
|---|---|---|
| Lockfile format | Universal, cross-platform | Cross-platform |
| Python version management | Built-in | Needs pyenv |
| Workspaces (monorepo) | Yes, Cargo-style | No |
| Library publishing | uv publish | poetry publish |
| Dependency groups | Yes | Yes |
PEP 621 (pyproject.toml) | Native | Since 2.0 |
| Single binary, no Python needed | Yes | No |
| Inline script dependencies | uv run script.py | No |
| Plugin system | No | Yes |
| pip CLI compatibility | uv pip install | No |
uv covers more ground. Poetry covers its ground well. The biggest functional gaps are workspaces (uv has them, Poetry doesn’t) and plugins (Poetry has them, uv doesn’t).
When to Use uv Over Poetry
- You need fast CI. Faster installs on every run add up across a team.
- You manage multiple Python versions. uv downloads and manages them directly, no pyenv required.
- You run a monorepo. uv workspaces let multiple packages share a single lockfile (here’s the full monorepo setup).
- You want one tool instead of three. uv replaces pyenv + virtualenv + pip-tools in a single binary.
- You’re starting from scratch. There’s no legacy Poetry config to migrate.
When to Use Poetry Over uv
- Your team is already productive with Poetry and CI speed isn’t a bottleneck.
- You rely on Poetry plugins (e.g.,
poetry-dynamic-versioning) that have no uv equivalent. - You prefer Poetry’s strict dependency group model for separating dev/test/docs dependencies.
- You’re maintaining an existing Poetry project and don’t have time to migrate right now.
For most new projects in 2026, uv is the stronger choice. But Poetry is a mature, well-maintained tool, and switching for the sake of switching isn’t worth the effort unless you have a concrete pain point.
Three Package Managers Walk Into a Repo
Python packaging has been a mess for decades. Every few years, a new tool promises to fix it. Most of them don’t. But the current generation (uv, pip, and Poetry) actually covers three distinct philosophies, and picking the right one in 2026 depends less on benchmarks and more on what you’re building.
pip is the default. It ships with Python. It does one thing: install packages. It doesn’t manage environments, create lockfiles, or organize workspaces. Since 2008, that’s been enough.
Poetry arrived in 2018 with Cargo-like ambitions for Python. It brought lockfiles, dependency groups, virtual environment management, and library publishing under one roof. By 2023, it was the go-to for serious Python projects.
uv showed up in February 2024, written in Rust by the Astral team (the Ruff people). It started as a pip replacement, then grew into a full project manager. In March 2026, OpenAI announced it would acquire Astral and committed to keeping uv open source (it’s dual-licensed MIT/Apache 2.0). The deal hasn’t closed yet, but development continues at full speed.
The Benchmarks
Two sets of public numbers are worth knowing.
Astral’s benchmarks. The uv README’s headline claim is 10–100x faster than pip, and BENCHMARKS.md backs it with the install and resolution timings in the table above. uv leads every scenario, by about 2x on a cold install and by far more everywhere else. The benchmark scripts live in the repo, so anyone can rerun them on their own hardware.
Adoption. Downloads aren’t speed, but they show where the ecosystem went. pypistats.org counted about 123 million uv downloads from PyPI over the last month, against about 41 million for Poetry (September 2026, mirrors excluded).
The speed comes from doing the slow parts concurrently: uv downloads, resolves and installs in parallel, and its global cache means a warm install mostly links files that are already on disk. On ephemeral CI runners, persisting that cache between jobs (astral-sh/setup-uv has an enable-cache option) is what keeps the advantage.
Poetry’s resolver has gotten better since 2.0, but it’s still single-threaded for the resolution step. pip-tools (pip-compile) works but feels like duct tape on a tool that was never designed for lockfiles.
Feature Comparison
Speed is one axis. Features are the other.
| Feature | uv | Poetry | pip |
|---|---|---|---|
| Lockfile | ✅ Universal (uv.lock) | ✅ (poetry.lock) | ⚠️ Experimental (pip lock) |
| Workspaces | ✅ Cargo-style | ❌ | ❌ |
| Python version management | ✅ Built-in | ❌ (needs pyenv) | ❌ (needs pyenv) |
| Venv management | ✅ Automatic | ✅ Automatic | ❌ Manual |
| Library publishing | ✅ uv publish (since 0.4) | ✅ poetry publish | ❌ (use twine) |
| Dependency groups | ✅ | ✅ | ❌ |
| PEP 621 compliance | ✅ Native | ✅ Since 2.0 | N/A |
| pip CLI compatibility | ✅ uv pip install | ❌ | ✅ (it is pip) |
| Single binary, no Python needed | ✅ | ❌ | ❌ |
| Scripts / inline deps | ✅ uv run | ❌ | ❌ |
A few things in this table deserve more context:
uv’s universal lockfile is cross-platform by default. One uv.lock works on macOS, Linux, and Windows across Python versions. Poetry’s lockfile is also cross-platform, but uv’s format is resolution-complete — it includes every platform variant so you never re-resolve on a different OS.
Python version management is built into uv. Run uv python install 3.14 and it downloads the right build. No pyenv, no system Python conflicts. On fresh CI runners, this can shave minutes off your setup step. uv also supports the free-threaded build variant — uv python install 3.14t — which we benchmarked in our Python 3.14 free-threading guide.
Library publishing used to be Poetry’s clear advantage, but uv caught up. Since version 0.4, uv has native uv build and uv publish commands that handle building and uploading to PyPI. Poetry’s poetry publish still works great, but this is no longer a differentiator.
The OpenAI Acquisition Question
On March 19, 2026, OpenAI announced it would acquire Astral — the company behind uv, Ruff, and ty. After the deal closes, the Astral team will join OpenAI’s Codex group.
The big question is long-term trust. uv is dual-licensed under MIT and Apache 2.0, and Ruff is MIT. Neither can be pulled back. But corporate priorities shift. OpenAI says it’ll continue supporting Astral’s open source tools, and as of August 2026 the deal still hasn’t closed — it’s pending regulatory approval — with nothing changed for uv’s development. uv 0.12.3 shipped in early August with regular updates.
On balance, the acquisition is a net positive in the short term (more funding, more engineers) and a question mark long-term. If OpenAI deprioritizes uv in favor of Codex-specific tooling, the community will fork. MIT makes that easy. For now, uv is still the right default for new projects.
Migration: From pip to uv
Migrating from pip to uv takes about five minutes. uv has a uv pip interface that’s a drop-in replacement:
# Before
pip install -r requirements.txt
# After
uv pip install -r requirements.txt
Same flags, same behavior, and per Astral 10–100x faster. Your requirements.txt files work unchanged. If you want to graduate to full project management:
# Initialize a uv project from existing requirements
uv init
uv add -r requirements.txt
uv lock
This generates a pyproject.toml and uv.lock. Your CI goes from this:
# Old GitHub Actions
- uses: actions/setup-python@v7
with:
python-version: "3.14"
- run: pip install -r requirements.txt
To this:
# New GitHub Actions
- uses: astral-sh/setup-uv@v9
- run: uv sync
Migration: From Poetry to uv
More work, but not bad. The migrate-to-uv tool automates most of it:
uvx migrate-to-uv
This converts your pyproject.toml from Poetry’s format to PEP 621, generates a uv.lock, and updates your dependency specifications. Manual steps after:
- Remove the
[tool.poetry]section frompyproject.toml - Delete
poetry.lock - Update CI scripts to use
uv syncinstead ofpoetry install - Update Dockerfiles if applicable
Expect a few hours for a medium-sized project. The main friction points are Poetry plugins (which have no uv equivalent) and custom publish scripts (which need to switch to build + twine).
When to Use Each
Here’s the decision tree:
Use uv if:
- You’re starting a new project (any size)
- CI speed matters to your team
- You manage multiple Python versions
- You want workspaces for monorepos
- You’re tired of managing pyenv + pip + virtualenv + pip-tools as separate tools
Use Poetry if:
- You publish libraries to PyPI and want one-command publishing
- Your team is already productive with Poetry and has no CI bottleneck
- You rely on Poetry plugins that have no uv equivalent
Use pip if:
- You’re writing a one-off script
- You’re teaching Python to beginners (pip is what every tutorial uses)
- You’re working in a constrained environment where you can’t install extra tools
The “use pip” bucket keeps shrinking. uv can run single-file scripts with inline dependencies (uv run script.py), which eliminates the last case where pip-only was simpler.
Gotchas and Sharp Edges
uv is still at 0.12.x, which means the API can change between minor versions. In practice, the core commands (uv sync, uv add, uv run) have been stable since 0.5, but if you’re writing CI scripts, pin your uv version.
Large dependency trees with loose version constraints are where Poetry’s resolver struggles most, in time and in memory, and on small CI runners that can end in an out-of-memory kill. Tightening a few upper bounds usually helps; uv’s compiled resolver is far less sensitive to it.
pip added an experimental pip lock command back in 25.1 that generates pylock.toml files per PEP 751. But it’s still platform-specific: you get a lockfile for the OS you ran it on, not a universal one. Before that, you needed pip-compile from pip-tools, which most teams still use.
One more thing worth knowing: uv ships as a standalone binary. It doesn’t need Python installed to run. This means you can install uv on a bare CI runner, have it download Python, create a venv, and install your dependencies. Poetry and pip both require Python to already be installed.
What’s Coming Next
uv’s roadmap focuses on deeper IDE integration and tighter hooks with OpenAI’s Codex for AI-assisted dependency management, though no timeline exists for the Codex integration.
The Poetry team continues work on resolver performance improvements. Speed is their biggest acknowledged gap, and they’ve discussed parallel resolution in GitHub issues, but nothing has shipped yet.
pip continues to get incremental updates and is now at 26.2. The experimental pip lock command that generates pylock.toml files per PEP 751 landed back in pip 25.1, and pip has kept refining PEP 751 support since. pip’s scope is expanding slowly, but it’s still primarily a package installer.
FAQ
Can I use uv as a complete replacement for pip?
Yes. The uv pip command is a drop-in replacement that accepts all the same flags. For full project management, use uv init, uv add, and uv sync instead.
Is uv stable enough for production?
The core commands have been stable since version 0.5. Major companies run uv in production CI (it gets over 120 million PyPI downloads a month for a reason). Pin your uv version in CI scripts to avoid surprises.
Will Poetry be abandoned now that uv exists?
No. Poetry 2.4 shipped in mid-2026 and development continues. Poetry has a different philosophy (integrated publishing, strict dependency groups) that still appeals to library authors.
Does the OpenAI acquisition mean uv will become closed source?
uv is MIT licensed. Even if OpenAI stopped development tomorrow, anyone could fork and continue the project. OpenAI has publicly committed to maintaining uv as open source.
Should I migrate existing Poetry projects to uv?
Only if CI speed or workspace support is a real pain point. Poetry works fine for established projects. If you’re starting new projects alongside legacy ones, use uv for the new ones and migrate the old ones when it makes sense. Don’t do a big-bang migration for its own sake.
Is uv faster than Poetry?
Yes, significantly. Astral’s published benchmarks show uv about 2x faster than Poetry on a cold install and roughly 10x or more on warm installs and dependency resolution, and the project claims 10–100x over pip. The gap comes from uv’s Rust implementation, which resolves and downloads in parallel and links packages from a global cache, while Poetry’s resolver runs in Python. Time uv sync against poetry install on your own lockfile to get the number that applies to your project.
Can uv replace Poetry?
For most workflows, yes. uv handles dependency management, lockfiles, virtual environments, Python version management, and publishing — everything Poetry does, plus workspaces and inline script dependencies. The main exception is Poetry plugins. If you rely on plugins like poetry-dynamic-versioning, there’s no uv equivalent yet.
Should I switch from Poetry to uv?
Only if you have a concrete reason. If your CI is slow, your team juggles pyenv and Poetry separately, or you need monorepo workspaces, uv solves those problems. If Poetry works fine for your team and CI speed isn’t a bottleneck, there’s no urgency to switch. New projects should start with uv; existing Poetry projects can migrate when it makes practical sense.
What is the difference between uv and Poetry?
Both are Python project managers, but uv is written in Rust and ships as a standalone binary that doesn’t need Python to run. uv is much faster (Astral claims 10–100x over pip), supports workspaces for monorepos, manages Python versions directly, and uses a universal cross-platform lockfile. Poetry has a plugin system, stricter dependency group semantics, and a longer track record. uv is backed by Astral (which OpenAI agreed to acquire in 2026); Poetry is community-maintained.
For the bigger picture of how uv fits into the 2026 toolchain, including type checkers and formatters, see the Python tooling guide. And if you manage several packages in one repo, uv workspaces solve the monorepo case specifically.
Sources
- uv — astral-sh/uv on GitHub — release history and changelog (latest: 0.12.3, August 2026)
- Poetry — python-poetry/poetry — current release (2.4.1, May 2026) and docs
- pip on PyPI — current release (26.2.1) and changelog
- OpenAI to acquire Astral — the March 2026 acquisition announcement (deal still pending as of August 2026)
- uv BENCHMARKS.md — Astral’s install and resolution benchmarks against Poetry, PDM, pip-sync and pip-compile
- pypistats: uv and pypistats: poetry — monthly PyPI download counts
- PEP 751 — pylock.toml — the standardized lockfile format behind
pip lock
Bottom Line
The Python packaging story in 2026 is the clearest it’s been in a decade. uv won the performance race so decisively that the comparison feels unfair. It also won the feature race for project management, with workspaces, Python version management, and a universal lockfile that Poetry and pip can’t match.
If you’re choosing a tool for a new Python project today, the answer is uv. Beyond the raw speed, the real draw is consolidation: one tool replaces pyenv, virtualenv, pip, pip-tools, and most of what Poetry does, all in a single binary that installs in under a second.
Most new Python projects in 2026 will start with uv init. And that’s about right. If you want to see the full workflow in action, our uv Python tutorial builds a CLI tool from uv init to Docker deployment.