Advertisement · 728 × 90

Posts by konsti

Bar plots showing the relative share by installer for the top 50 pypi packages. There's no clear pattern.

Bar plots showing the relative share by installer for the top 50 pypi packages. There's no clear pattern.

Appendix: There's also plots where i'm just not sure how to interpret it. If we segment the top 50 by tool, why is it so inconsistent? Why does everyone install awscli with pip, but with pluggy and packaging users uv is popular? (when uv is the only package manager in the list not using packaging)

4 days ago 0 0 0 0
Python Ecosystem Statistics

All plots are additionally published to konstin.github.io/ci-stats-uv/. Shout-out to grep.app, to @hugovk.dev for the ever useful hugovk.dev/top-pypi-packages/ and to the pypi team for making this analysis possible with the public linehaul dataset!

4 days ago 1 0 1 0
Two lines, one for CI, one for non-CI, showing the cumulative percentage of downloads by uv version given the uv release date. Neither line is a smooth as you'd think it is, but follow kinda the same patterns, except CI starts and non-CI starts low and then they coalesce.

Cumulative distribution of pip downloads by version age (years since release, linehaul data from the last 7 days), split by CI vs non-CI. CI: 50% within 70 days, 90% within 803 days. Non-CI: 50% within 803 days, 90% within 1501 days.

Two lines, one for CI, one for non-CI, showing the cumulative percentage of downloads by uv version given the uv release date. Neither line is a smooth as you'd think it is, but follow kinda the same patterns, except CI starts and non-CI starts low and then they coalesce. Cumulative distribution of pip downloads by version age (years since release, linehaul data from the last 7 days), split by CI vs non-CI. CI: 50% within 70 days, 90% within 803 days. Non-CI: 50% within 803 days, 90% within 1501 days.

Then for pip again, we have a large almost immediate adoption in CI, with non-CI adoption lagging for years, while the trends in both are similar.

4 days ago 0 0 1 0
Two lines, one for CI, one for non-CI, showing the cumulative percentage of downloads by uv version given the uv release date. Neither line is a smooth as you'd think it is, but the non-CI line makes jump that almost look non-continuous.

Cumulative distribution of uv downloads by version age (years since release, linehaul data from the last 7 days), split by CI vs non-CI. CI: 50% within 28 days, 90% within 231 days. Non-CI: 50% within 100 days, 90% within 308 days.

Two lines, one for CI, one for non-CI, showing the cumulative percentage of downloads by uv version given the uv release date. Neither line is a smooth as you'd think it is, but the non-CI line makes jump that almost look non-continuous. Cumulative distribution of uv downloads by version age (years since release, linehaul data from the last 7 days), split by CI vs non-CI. CI: 50% within 28 days, 90% within 231 days. Non-CI: 50% within 100 days, 90% within 308 days.

If we zoom in on uv and split by CI vs. non-CI, we see again from another perspective how biased the dataset is: We'd expect CI and non-CI curves to run parallel. Instead, we see a jagged non-CI adoption with large, unnatural jumps.

4 days ago 0 0 1 0
Lines in a ROC-like shape.

Cumulative distribution of downloads by version age (years since release, linehaul data from the last 7 days), comparing uv, pip, and poetry. uv: 50% at 58 days, 90% at 308 days. pip: 50% at 445 days, 90% at 1352 days. poetry: 50% at 214 days, 90% at 708 days.

Lines in a ROC-like shape. Cumulative distribution of downloads by version age (years since release, linehaul data from the last 7 days), comparing uv, pip, and poetry. uv: 50% at 58 days, 90% at 308 days. pip: 50% at 445 days, 90% at 1352 days. poetry: 50% at 214 days, 90% at 708 days.

We can also use this data to track how quickly new versions are adopted, at least according to linehaul download counts from the last 7 days. The plot is cumulative, so it says e.g. that 80% of all downloads come from a pip version that was released less than 3 years days ago.

4 days ago 0 0 1 0
A bar chart with uv versions, where each bar is split into CI and non-CI section, where the split is very inconsistent.

Wheel and source distribution downloads by uv version in the last 7 days (linehaul data, top 20 versions), split by CI vs non-CI. 0.11.2: 1.9B (CI: 995M, non-CI: 887M), 0.11.1: 1.5B (CI: 1.0B, non-CI: 472M), 0.9.22: 1.0B (CI: 19M, non-CI: 990M), 0.10.12: 872M (CI: 599M, non-CI: 273M), 0.11.0: 701M (CI: 449M, non-CI: 252M), 0.9.15: 454M (CI: 6M, non-CI: 448M), 0.7.13: 424M (CI: 8M, non-CI: 416M), 0.10.0: 367M (CI: 243M, non-CI: 124M), 0.9.30: 357M (CI: 83M, non-CI: 273M), 0.10.9: 284M (CI: 54M, non-CI: 230M), 0.10.10: 241M (CI: 190M, non-CI: 52M), 0.10.2: 236M (CI: 199M, non-CI: 37M), 0.10.4: 225M (CI: 160M, non-CI: 65M), 0.9.26: 219M (CI: 142M, non-CI: 77M), 0.9.5: 213M (CI: 34M, non-CI: 179M), 0.6.9: 188M (CI: 8M, non-CI: 180M), 0.10.11: 160M (CI: 44M, non-CI: 116M), 0.8.15: 130M (CI: 5M, non-CI: 125M), 0.8.14: 128M (CI: 122M, non-CI: 6M), 0.10.6: 109M (CI: 61M, non-CI: 48M).

A bar chart with uv versions, where each bar is split into CI and non-CI section, where the split is very inconsistent. Wheel and source distribution downloads by uv version in the last 7 days (linehaul data, top 20 versions), split by CI vs non-CI. 0.11.2: 1.9B (CI: 995M, non-CI: 887M), 0.11.1: 1.5B (CI: 1.0B, non-CI: 472M), 0.9.22: 1.0B (CI: 19M, non-CI: 990M), 0.10.12: 872M (CI: 599M, non-CI: 273M), 0.11.0: 701M (CI: 449M, non-CI: 252M), 0.9.15: 454M (CI: 6M, non-CI: 448M), 0.7.13: 424M (CI: 8M, non-CI: 416M), 0.10.0: 367M (CI: 243M, non-CI: 124M), 0.9.30: 357M (CI: 83M, non-CI: 273M), 0.10.9: 284M (CI: 54M, non-CI: 230M), 0.10.10: 241M (CI: 190M, non-CI: 52M), 0.10.2: 236M (CI: 199M, non-CI: 37M), 0.10.4: 225M (CI: 160M, non-CI: 65M), 0.9.26: 219M (CI: 142M, non-CI: 77M), 0.9.5: 213M (CI: 34M, non-CI: 179M), 0.6.9: 188M (CI: 8M, non-CI: 180M), 0.10.11: 160M (CI: 44M, non-CI: 116M), 0.8.15: 130M (CI: 5M, non-CI: 125M), 0.8.14: 128M (CI: 122M, non-CI: 6M), 0.10.6: 109M (CI: 61M, non-CI: 48M).

Instead, it looks like some versions generating 100s of millions of downloads a week are a specific project or organizing, shifting our summary statistics through few large outliers.

4 days ago 0 0 1 0

Subsetting the data more also shows us how biased our datasets are: Here we see the popularity of each uv version according to linehaul data of the last 7 days. If older versions were in use organically, we'd expect the general 2/3 non-CI vs. 1/3 CI split for each version.

4 days ago 0 0 1 0
Advertisement
Several smoothed line plots with their more with their more zigzag finer grained data behind them.

PyPI wheel and source distribution downloads by installer tool (linehaul data, 2019-02-03 to 2026-04-14), with daily, 7-day, and 90-day rolling averages. Latest 90-day average: pip: 2.4B/day, uv: 1.5B/day, poetry: 105M/day, (unknown): 23M/day, requests: 13M/day, bandersnatch: 8M/day, Bazel: 8M/day, Browser: 4M/day, setuptools: 1M/day.

Several smoothed line plots with their more with their more zigzag finer grained data behind them. PyPI wheel and source distribution downloads by installer tool (linehaul data, 2019-02-03 to 2026-04-14), with daily, 7-day, and 90-day rolling averages. Latest 90-day average: pip: 2.4B/day, uv: 1.5B/day, poetry: 105M/day, (unknown): 23M/day, requests: 13M/day, bandersnatch: 8M/day, Bazel: 8M/day, Browser: 4M/day, setuptools: 1M/day.

Several smoothed line plots with their more with their more zigzag finer grained data behind them.

PyPI download market share by installer tool (linehaul data), with daily, 7-day, and 90-day rolling averages. Latest 90-day average share: pip: 59.9%, uv: 36.2%, poetry: 2.5%, (unknown): 0.6%, requests: 0.3%, bandersnatch: 0.2%, Bazel: 0.2%, Browser: 0.1%.

Several smoothed line plots with their more with their more zigzag finer grained data behind them. PyPI download market share by installer tool (linehaul data), with daily, 7-day, and 90-day rolling averages. Latest 90-day average share: pip: 59.9%, uv: 36.2%, poetry: 2.5%, (unknown): 0.6%, requests: 0.3%, bandersnatch: 0.2%, Bazel: 0.2%, Browser: 0.1%.

We get a very different picture for linehaul data, which tracks the file downloads from pypi from tools that support it for absolute download (first plot) and relative counts (second plot). I believe that's due to large projects, which need to do a many more downloads, being very eager to adopt uv.

4 days ago 0 0 1 0
A plot with several lines with dotted linear regressions beneath them.

Relative growth in grep.app search hits for package manager commands since the start of recording, with linear regression projections. Current growth from baseline: uv run: +522% (baseline: 8,439), uv sync: +413% (baseline: 6,426), uv pip: +267% (baseline: 6,919), pip install: +32% (baseline: 546,000), pdm install: +18% (baseline: 813), poetry install: +1% (baseline: 20,809).

A plot with several lines with dotted linear regressions beneath them. Relative growth in grep.app search hits for package manager commands since the start of recording, with linear regression projections. Current growth from baseline: uv run: +522% (baseline: 8,439), uv sync: +413% (baseline: 6,426), uv pip: +267% (baseline: 6,919), pip install: +32% (baseline: 546,000), pdm install: +18% (baseline: 813), poetry install: +1% (baseline: 20,809).

If we look at the rate of change since the start of the record, we get trends in adoption.

4 days ago 0 0 1 0
Two stacked line charts with the same axes but different scales.

Daily search hits on grep.app for package manager commands, from 2025-05-07 to 2026-04-16. pip install (top panel): 718K. Alternative package managers (bottom panel): uv run: 53K, uv sync: 33K, uv pip: 25K, poetry install: 21K, uv build: 7K, uv tool: 6K, uv python: 4K, uv publish: 3K, pdm install: 960.

Two stacked line charts with the same axes but different scales. Daily search hits on grep.app for package manager commands, from 2025-05-07 to 2026-04-16. pip install (top panel): 718K. Alternative package managers (bottom panel): uv run: 53K, uv sync: 33K, uv pip: 25K, poetry install: 21K, uv build: 7K, uv tool: 6K, uv python: 4K, uv publish: 3K, pdm install: 960.

If we're looking at package manage popularity, it's a question of which data source we're asking. Below is the number of hits in grep.app for package manager subcommands (with many uv subcommands, since i also wanted to track uv pip vs the uv project interface).

4 days ago 1 1 1 0
Bar plot with two bars for each name.

Build backend distribution among the top 15,000 PyPI packages by downloads, comparing all packages vs those uploaded in the last 365 days (n=9,100). setup.py: 5,655 all, 1,764 recent. setuptools.build_meta: 4,521 all, 3,687 recent. hatchling.build: 1,756 all, 1,523 recent. poetry.core.masonry.api: 907 all, 538 recent. No source distribution: 733 all, 463 recent. flit_core.buildapi: 463 all, 340 recent. maturin: 254 all, 231 recent. uv_build: 152 all, 152 recent. pdm.backend: 109 all, 95 recent. scikit_build_core.build: 89 all, 82 recent. poetry.masonry.api: 81 all, 14 recent. Custom backend: 66 all, 58 recent. pbr.build: 53 all, 53 recent. poetry_dynamic_versioning.backend: 33 all, 25 recent. mesonpy: 28 all, 25 recent.

Bar plot with two bars for each name. Build backend distribution among the top 15,000 PyPI packages by downloads, comparing all packages vs those uploaded in the last 365 days (n=9,100). setup.py: 5,655 all, 1,764 recent. setuptools.build_meta: 4,521 all, 3,687 recent. hatchling.build: 1,756 all, 1,523 recent. poetry.core.masonry.api: 907 all, 538 recent. No source distribution: 733 all, 463 recent. flit_core.buildapi: 463 all, 340 recent. maturin: 254 all, 231 recent. uv_build: 152 all, 152 recent. pdm.backend: 109 all, 95 recent. scikit_build_core.build: 89 all, 82 recent. poetry.masonry.api: 81 all, 14 recent. Custom backend: 66 all, 58 recent. pbr.build: 53 all, 53 recent. poetry_dynamic_versioning.backend: 33 all, 25 recent. mesonpy: 28 all, 25 recent.

For build backends, we can see shift in those projects making new releases, going from plain setup.py to pyproject.toml and migrating from poetry 1 (poetry.masonry.api)

4 days ago 1 1 1 0
Bar chart and line plot, overlayed.

Minimum Python version from Requires-Python in the latest version of the top 15,000 PyPI packages by downloads. 2.x: 218 (1.5%), 3.0: 117 (0.8%), 3.4: 52 (0.3%), 3.5: 183 (1.2%), 3.6: 815 (5.4%), 3.7: 1,105 (7.4%), 3.8: 1,743 (11.6%), 3.9: 3,294 (22.0%), 3.10: 2,987 (19.9%), 3.11: 432 (2.9%), 3.12: 119 (0.8%), 3.13: 16 (0.1%), Not specified: 3,895 (26.0%). Cumulative (among packages with a declared minimum): 3.0: 1%, 3.4: 2%, 3.5: 3%, 3.6: 11%, 3.7: 21%, 3.8: 37%, 3.9: 67%, 3.10: 95%, 3.11: 99%, 3.12: 100%.

Bar chart and line plot, overlayed. Minimum Python version from Requires-Python in the latest version of the top 15,000 PyPI packages by downloads. 2.x: 218 (1.5%), 3.0: 117 (0.8%), 3.4: 52 (0.3%), 3.5: 183 (1.2%), 3.6: 815 (5.4%), 3.7: 1,105 (7.4%), 3.8: 1,743 (11.6%), 3.9: 3,294 (22.0%), 3.10: 2,987 (19.9%), 3.11: 432 (2.9%), 3.12: 119 (0.8%), 3.13: 16 (0.1%), Not specified: 3,895 (26.0%). Cumulative (among packages with a declared minimum): 3.0: 1%, 3.4: 2%, 3.5: 3%, 3.6: 11%, 3.7: 21%, 3.8: 37%, 3.9: 67%, 3.10: 95%, 3.11: 99%, 3.12: 100%.

Looking that 15k most popular pypi packages, python 3.10 is the lowest version that's overwhelmingly supported, which is also the oldest current non-EOL version

4 days ago 1 1 1 1

I've started compiling python ecosystem statistics about metadata and tool popularity 🧵

All figures, captions and dataset descriptions are on blog.schuetze.link/python-ecosy...

4 days ago 10 1 1 0
Post image

Here are a couple of examples. Lung cancer survival rates for EGFR+ mutated Lung cancer.

2 weeks ago 666 113 9 37
Preview
PEP 772: Packaging Council governance process (Round 3) The Python Steering Council is happy to accept PEP 772, establishing a Python Packaging Council with broad delegated authority over packaging standards, tools, and implementations. This is the final ...

PEP 772, creating an official Python packaging council, has been approved! 🎉

I'm so excited for the council and the work it will do. Many thanks to @pumpichank.bsky.social, @eximious.bsky.social, and @pradyunsg.me for your hard work in making this happen!

discuss.python.org/t/pep-772-pa...

4 days ago 10 4 1 0

I'd love to write a packaging section for it, we're really missing a good community news source.

3 weeks ago 0 0 0 0
Advertisement

the cuda support in conda-forge have a rounding error? surely because of me. all your wheels turned back into eggs? my bad. numpy built with cursed gcc flags that break unrelated libraries? no ok that one's your fault.

1 year ago 29 1 1 0

oh please i hope not, i really want to do other things than arguing over PEP interpretations

1 year ago 3 0 0 0
Constraints are Good: Python's Metadata Dilemma Some of the issues of why Python packaging is unnecessarily hard.

“Python just has a metadata problem. Python's metadata system is too complex and suffers from what I would call ‘lack of constraints’.” lucumr.pocoo.org/2024/11/26/p...

1 year ago 56 2 8 3