devtools
guide
10 Oct 2026
Five Python installers, nineteen packages, and the gap that only appears warm
Cold, the fastest installer beat pip by 2.2x. Warm, with every wheel already on disk, it beat pip by 125x. Those are two different questions and only one of them is on your CI bill.
By Purvansh Parmar
Checked 2026-10-21
Read 7 min
Entries 5
Pick an installer and you pick two numbers. The first is what happens on a machine that has never seen your dependencies, which is the number everyone benchmarks. The second is what happens on the machine that has seen them forty times already, which is the number you actually pay, every push, for years. Nineteen packages into a clean container showed those two numbers are not related: the spread was 2.2x cold and 125x warm, and the ranking changed between them.
How this was checkedInstalled the same nineteen pinned packages, including pandas, numpy and boto3, into a clean python:3.12-slim container five different ways. Each installer got its own empty Docker cache volume for the cold run and the same volume again for the warm one, so the warm number is the real second-build case. Timed inside the container with integer nanosecond arithmetic, because the slim image has no bc. Then checked the warm venv actually imports what it claims to, since a 321 millisecond install of pandas deserves suspicion.
What I compared on
- warm wall clock, which is what a cached CI job and a local rebuild actually cost
- cold wall clock, for the machine that has never seen these packages
- whether the resulting environment really contains working packages
Rust installer and resolver from Astral, usable as a drop in replacement through its uv pip interface.
Wins
The warm case stops being an install at all. It hardlinks out of a content addressed cache, so repeating the work costs a filesystem walk, and the time barely moves as the dependency set grows.
Loses
It is another binary in the image and another project to track, and uv pip install deliberately imitates an interface whose behaviour it does not always match exactly. Cold, it is only 2.2x ahead of pip, so a CI job with no cache restores most of the gap.
337 ms warm48.2 s cold125x faster than pip warm
Project manager with its own lock file and resolver, driven here through poetry add on a fresh project.
Wins
Its warm path is genuinely good, 9.4x faster than pip on the same cache, and you get a lock file and a project definition out of it rather than a bare environment.
Loses
The cold run is 50 percent slower than uv's, and poetry add resolves the whole dependency graph again on every invocation, so adding one package to a large project is not a cheap operation.
4.5 s warm72.3 s cold9.4x faster than pip warm
The older Pipfile based workflow, installing from the same requirements file into its managed virtualenv.
Wins
It reads a plain requirements.txt without conversion, which makes it the least disruptive of the project managers to introduce into an existing repository.
Loses
24.3 seconds warm is most of a minute per CI job for no structural benefit over poetry, and its resolver is the part of the tool people most often end up fighting.
24.3 s warm88.4 s cold1.7x faster than pip warm
The installer already in every Python image, pointed at a venv with no extra flags.
Wins
It is already there. No bootstrap step, no second binary, no new file in the repository, and every piece of documentation on the internet assumes it.
Loses
The warm case barely improves, becuase pip still unpacks and copies each wheel into the environment rather than linking it. Having the bytes locally saves the download and almost nothing else.
42.2 s warm105.1 s cold60 percent of cold time remains when warm
Standards first project manager built around pyproject.toml and PEP 582 style layouts.
Wins
It is the most standards aligned of the project managers, which matters if you want the repository to stay readable by tools that are not PDM.
Loses
The warm run saved only 51 percent against its own cold run and came out 9 percent slower than pip, so the project management is not buying you anything on the number you pay most often.
45.9 s warm93.4 s cold9 percent slower than pip warm
Side by side
| Cold | Warm | Warm vs pip |
| uv 0.13.4 | 48.2 s | 0.34 s | 125x faster |
| Poetry 2.5.1 | 72.3 s | 4.5 s | 9.4x faster |
| Pipenv 2026.10.2 | 88.4 s | 24.3 s | 1.7x faster |
| pip 25.0.1 | 105.1 s | 42.2 s | baseline |
| PDM 2.29.3 | 93.4 s | 45.9 s | 9% slower |
Verdict
Use uv. Not because of the cold number, which is a respectable but unexciting 2.2x, but because 337 milliseconds against 42 seconds changes what the install step is: it stops being a thing you wait for and becomes a thing you stop caching. Everything else here spends its warm run unpacking archives it already had. The one caveat worth stating plainly is that the whole 125x lives in the cache, so if your CI throws its cache away on every run you are buying the 2.2x and nothing else, and fixing the cache is the cheaper piece of work.
Sources