uv/crates
Andrew Gallant 6c98ae9d77
pep440: rewrite the parser and make version comparisons cheaper (#789)
This PR builds on #780 by making both version parsing faster, and
perhaps more importantly, making version comparisons much faster.
Overall, these changes result in a considerable improvement for the
`boto3.in` workload. Here's the status quo:

```
$ time puffin pip-compile --no-build --cache-dir ~/astral/tmp/cache/ -o /dev/null ./scripts/requirements/boto3.in
Resolved 31 packages in 34.56s

real    34.579
user    34.004
sys     0.413
maxmem  2867 MB
faults  0
```

And now with this PR:

```
$ time puffin pip-compile --no-build --cache-dir ~/astral/tmp/cache/ -o /dev/null ./scripts/requirements/boto3.in
Resolved 31 packages in 9.20s

real    9.218
user    8.919
sys     0.165
maxmem  463 MB
faults  0
```

This particular workload gets stuck in pubgrub doing resolution, and
thus benefits mightily from a faster `Version::cmp` routine. With that
said, this change does also help a fair bit with "normal" runs:

```
$ hyperfine -w10 \
    "puffin-base pip-compile --cache-dir ~/astral/tmp/cache/ -o /dev/null ./scripts/benchmarks/requirements.in" \
    "puffin-cmparc pip-compile --cache-dir ~/astral/tmp/cache/ -o /dev/null ./scripts/benchmarks/requirements.in"
Benchmark 1: puffin-base pip-compile --cache-dir ~/astral/tmp/cache/ -o /dev/null ./scripts/benchmarks/requirements.in
  Time (mean ± σ):     337.5 ms ±   3.9 ms    [User: 310.5 ms, System: 73.2 ms]
  Range (min … max):   333.6 ms … 343.4 ms    10 runs

Benchmark 2: puffin-cmparc pip-compile --cache-dir ~/astral/tmp/cache/ -o /dev/null ./scripts/benchmarks/requirements.in
  Time (mean ± σ):     189.8 ms ±   3.0 ms    [User: 168.1 ms, System: 78.4 ms]
  Range (min … max):   185.0 ms … 196.2 ms    15 runs

Summary
  puffin-cmparc pip-compile --cache-dir ~/astral/tmp/cache/ -o /dev/null ./scripts/benchmarks/requirements.in ran
    1.78 ± 0.03 times faster than puffin-base pip-compile --cache-dir ~/astral/tmp/cache/ -o /dev/null ./scripts/benchmarks/requirements.in
```

There is perhaps some future work here (detailed in the commit
messages), but I suspect it would be more fruitful to explore ways of
making resolution itself and/or deserialization faster.

Fixes #373, Closes #396
2024-01-05 11:57:32 -05:00
..
bench Use Clippy lint table over Cargo config (#490) 2023-11-22 15:10:27 +00:00
cache-key Split puffin-cache into Puffin-specific and generic utilities (#728) 2023-12-25 14:38:56 +00:00
distribution-filename pep440: rewrite the parser and make version comparisons cheaper (#789) 2024-01-05 11:57:32 -05:00
distribution-types Delete unused file (#772) 2024-01-04 11:32:12 +00:00
gourgeist Cache Tags on Interpreter (#726) 2023-12-25 13:41:10 +00:00
install-wheel-rs Add a dedicated error for missing RECORD files (#762) 2024-01-04 00:28:50 +00:00
pep440-rs pep440: rewrite the parser and make version comparisons cheaper (#789) 2024-01-05 11:57:32 -05:00
pep508-rs pep440: rewrite the parser and make version comparisons cheaper (#789) 2024-01-05 11:57:32 -05:00
platform-host Error when ldd is not in path (#506) 2023-11-28 05:55:04 +00:00
platform-tags Cache Tags on Interpreter (#726) 2023-12-25 13:41:10 +00:00
puffin-build Explain ld errors (#773) 2024-01-04 20:56:38 +01:00
puffin-cache Change internal representation of CacheEntry to avoid allocations (#730) 2023-12-26 02:10:30 +00:00
puffin-cli pep440: rewrite the parser and make version comparisons cheaper (#789) 2024-01-05 11:57:32 -05:00
puffin-client Update dependencies (#794) 2024-01-05 11:40:12 -05:00
puffin-dev Update dependencies (#794) 2024-01-05 11:40:12 -05:00
puffin-dispatch Model Python version as a PubGrub package (#745) 2024-01-03 15:20:45 +00:00
puffin-distribution Add spans to all significant tasks (#740) 2024-01-02 16:17:03 +00:00
puffin-extract Move source dist extraction into extract crate (#649) 2023-12-14 05:56:49 +00:00
puffin-fs Show resource and lockfile when waiting (#715) 2023-12-21 00:05:49 +01:00
puffin-git Split puffin-cache into Puffin-specific and generic utilities (#728) 2023-12-25 14:38:56 +00:00
puffin-installer Add context and diagnostics for missing METADATA (#761) 2024-01-03 19:09:23 -05:00
puffin-interpreter Update dependencies (#794) 2024-01-05 11:40:12 -05:00
puffin-normalize Add dedicated ID types to avoid opaque strings (#642) 2023-12-14 00:53:33 +00:00
puffin-resolver Update dependencies (#794) 2024-01-05 11:40:12 -05:00
puffin-traits Cancel waiting tasks on resolution error (#753) 2024-01-03 20:18:27 +00:00
puffin-warnings Rename puffin-warnings macros to avoid tracing collision (#694) 2023-12-18 21:33:21 +00:00
puffin-workspace Use Clippy lint table over Cargo config (#490) 2023-11-22 15:10:27 +00:00
pypi-types pep440: rewrite the parser and make version comparisons cheaper (#789) 2024-01-05 11:57:32 -05:00
requirements-txt Update dependencies (#794) 2024-01-05 11:40:12 -05:00
README.md Split puffin-cache into Puffin-specific and generic utilities (#728) 2023-12-25 14:38:56 +00:00

Crates

bench

Functionality for benchmarking Puffin.

cache-key

Generic functionality for caching paths, URLs, and other resources across platforms.

distribution-filename

Parse built distribution (wheel) and source distribution (sdist) filenames to extract structured metadata.

distribution-types

Abstractions for representing built distributions (wheels) and source distributions (sdists), and the sources from which they can be downloaded.

gourgeist

A venv replacement to create virtual environments in Rust.

install-wheel-rs

Install built distributions (wheels) into a virtual environment.]

pep440-rs

Utilities for interacting with Python version numbers and specifiers.

pep508-rs

Utilities for interacting with PEP 508 dependency specifiers.

platform-host

Functionality for detecting the current platform (operating system, architecture, etc.).

platform-tags

Functionality for parsing and inferring Python platform tags as per PEP 425.

puffin-build

A PEP 517-compatible build frontend for Puffin.

puffin-cache

Functionality for caching Python packages and associated metadata.

puffin-cli

Command-line interface for the Puffin package manager.

puffin-client

Client for interacting with PyPI-compatible HTTP APIs.

puffin-dev

Development utilities for Puffin.

puffin-dispatch

A centralized struct for resolving and building source distributions in isolated environments. Implements the traits defined in puffin-traits.

puffin-distribution

Client for interacting with built distributions (wheels) and source distributions (sdists). Capable of fetching metadata, distribution contents, etc.

puffin-extract

Utilities for extracting files from archives.

puffin-fs

Utilities for interacting with the filesystem.

puffin-git

Functionality for interacting with Git repositories.

puffin-installer

Functionality for installing Python packages into a virtual environment.

puffin-interpreter

Functionality for detecting and leveraging the current Python interpreter.

puffin-normalize

Normalize package and extra names as per Python specifications.

puffin-package

Types and functionality for working with Python packages, e.g., parsing wheel files.

puffin-resolver

Functionality for resolving Python packages and their dependencies.

puffin-traits

Shared traits for Puffin, to avoid circular dependencies.

pypi-types

General-purpose type definitions for types used in PyPI-compatible APIs.

puffin-warnings

User-facing warnings for Puffin.

requirements-txt

Functionality for parsing requirements.txt files.