PDM vs uv: Standards-Based Python Project Tools
PDM is a standards-forward Python project manager; uv is the faster Rust newcomer. Both use pyproject.toml and produce lockfiles.
PDM emphasizes adherence to Python packaging PEPs and offered early PEP 582 (__pypackages__) support. uv focuses on raw speed and a unified toolchain. The choice often comes down to standards-purity versus pipeline speed.
| PDM | uv | |
|---|---|---|
| Language | Python | Rust |
| Config | pyproject.toml | pyproject.toml |
| Lockfile | pdm.lock | uv.lock |
| PEP 582 (__pypackages__) | Supported | Not the focus |
| Install/resolve speed | Good | Very fast |
Where PDM wins
PDM tracks Python packaging standards closely and supports PEP 582 style local package directories, which some teams prefer to virtualenvs. If you value standards alignment and a Python-native tool you can extend, PDM is a strong, mature choice.
Where uv wins
uv is generally faster at resolution and install, and bundles Python version management and running into one binary. For CI where install time is a recurring cost, uv usually shaves more wall-clock time.
In CI
Both are deterministic when you commit the lockfile and cache by its hash. Decide on standards/feature fit first (for example PEP 582), then on speed: for most pipelines uv is faster, for standards-focused teams PDM is appealing.
The verdict
Choose PDM if standards adherence or PEP 582 workflows matter to you; choose uv when install speed and a single fast toolchain win. Both are reproducible and pyproject-based, so either is defensible.