uv dominates the Python dependency management market in 2026
uv has surpassed Poetry in popularity with 75 million monthly PyPI downloads. The Rust-based tool significantly outperforms Poetry and pip-tools in speed, completing cold installs in just three seconds compared to Poetry's 11 seconds.
I watched the PyPI download statistics shift as uv reached 75 million monthly downloads, surpassing Poetry’s 66 million. This momentum comes from a single Rust binary that replaces pip, pip-tools, pipx, pyenv, and virtualenv. In CI/CD pipelines, the speed difference saves real money. For a cold install from a lock file on Sentry’s dependency list, uv finishes in three seconds, while Poetry takes 11 seconds and pip-tools takes 33 seconds. Lock file generation shows an even wider gap, with uv completing in eight seconds versus Poetry’s 22 seconds and pip-tools’ 35 seconds. Adding a single package with uv takes less than one second, whereas Poetry takes three seconds and pip-tools takes six seconds. The Wagtail CMS team documented this crossover point, noting that uv also surpassed pip as the primary installer in CI environments. uv uses a global content-addressed cache to store wheels, so future installs from the same cache take milliseconds. This mechanism works by hardlinking packages from the cache into virtual environments, which prevents redundant downloads.
Technical comparisons and speed
The resolver gap between these tools becomes even more apparent when looking at a 47-dependency project where uv resolves dependencies in 1.4 seconds compared to the 22.3 seconds required by Poetry’s single-threaded resolver. This Danilchenko.dev benchmark shows that uv resolves dependencies roughly 16 times faster than Poetry. Poetry manages virtual environments and dependency resolution, but it does not manage Python interpreters. Teams using Poetry must still install pyenv or asdf to switch Python versions. uv includes uv python to install and pin specific CPython builds, which removes the onboarding friction caused by maintaining extra tools. uv also supports a native workspace model for multiple packages in one repository, which works like Cargo workspaces in Rust.
| Feature | uv | Poetry | pip-tools |
|---|---|---|---|
| Monthly PyPI Downloads | 75 million | 66 million | 19 million |
| Resolver Language | Rust | Python | Python |
| Python Management | Built-in (uv python) |
Requires pyenv/asdf | Requires pyenv/asdf |
| Speed (Cold Install) | ~3 seconds | ~11 seconds | ~33 seconds |
Poetry remains a solid choice for library authors because of its built-in publishing workflow to PyPI. It handles dependency groups like dev, test, and docs with more sophistication than uv. Users who prefer the standard pyproject.toml metadata find uv compatible because it follows PEP 621 from the start. uv handles single-file scripts with inline dependency metadata via PEP 723, allowing users to run a script with uv run without manual environment management. This capability allows developers to run standalone scripts with nothing more than uv. uv also provides uv tool install to replace pipx, allowing users to install CLI tools in isolated environments. However, Poetry’s resolver struggles on large dependency graphs compared to the Rust-based PubGrub resolver in uv. Does the speed of uv justify the risk of its changing API?
Implementation and Docker workflows
I migrated a FastAPI project to uv and used a two-stage Docker build to reduce image size by 80%. In the builder stage, uv pip install --system . installs dependencies into the system Python to avoid virtualenv overhead. The runtime stage contains only the necessary packages and the application. This pattern eliminates compilers and wheel caches from the final image, which reduces the attack surface. This approach uses metadata-first copying to leverage Docker layer caching, which prevents rebuilding dependencies when only application code changes. The process uses uv sync to ensure the environment matches the lockfile exactly.
The migration from Poetry requires removing the [tool.poetry] section from pyproject.toml and replacing it with standard [project] metadata. I replaced poetry install --with dev with uv sync --all-groups and changed poetry run pytest to uv run pytest. In my experience, this transition was straightforward because uv uses the same pyproject.toml standard. I also replaced Black with Ruff for formatting, which runs much faster during the linting step in CI. OpenAI acquired Astral in March 2026, yet the development of uv continues. uv’s API changes between versions, which can break CI scripts that rely on specific flags. You should stick with Poetry if your team relies on its mature publishing workflow.