![]() It looks like using _either_ async Rust with a `JoinSet` _or_ parallelizing a fixed threadpool with Rayon provide about a ~5% speed-up over our current serial approach: ```console ❯ hyperfine --runs 30 --warmup 5 --prepare "./target/release/puffin venv .venv" \ "./target/release/rayon sync ./scripts/benchmarks/requirements-large.txt" \ "./target/release/async sync ./scripts/benchmarks/requirements-large.txt" \ "./target/release/main sync ./scripts/benchmarks/requirements-large.txt" Benchmark 1: ./target/release/rayon sync ./scripts/benchmarks/requirements-large.txt Time (mean ± σ): 295.7 ms ± 16.9 ms [User: 28.6 ms, System: 263.3 ms] Range (min … max): 249.2 ms … 315.9 ms 30 runs Benchmark 2: ./target/release/async sync ./scripts/benchmarks/requirements-large.txt Time (mean ± σ): 296.2 ms ± 20.2 ms [User: 36.1 ms, System: 340.1 ms] Range (min … max): 258.0 ms … 359.4 ms 30 runs Benchmark 3: ./target/release/main sync ./scripts/benchmarks/requirements-large.txt Time (mean ± σ): 306.6 ms ± 19.5 ms [User: 25.3 ms, System: 220.5 ms] Range (min … max): 269.6 ms … 332.2 ms 30 runs Summary './target/release/rayon sync ./scripts/benchmarks/requirements-large.txt' ran 1.00 ± 0.09 times faster than './target/release/async sync ./scripts/benchmarks/requirements-large.txt' 1.04 ± 0.09 times faster than './target/release/main sync ./scripts/benchmarks/requirements-large.txt' ``` It's much easier to just parallelize with Rayon and avoid async in the underlying wheel code, so this PR takes that approach for now. |
||
---|---|---|
.. | ||
gourgeist | ||
install-wheel-rs | ||
pep440-rs | ||
pep508-rs | ||
platform-host | ||
platform-tags | ||
puffin-cli | ||
puffin-client | ||
puffin-installer | ||
puffin-interpreter | ||
puffin-package | ||
puffin-resolver | ||
wheel-filename | ||
README.md |
Crates
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-cli
Command-line interface for the Puffin package manager.
puffin-client
Client for interacting with PyPI-compatible HTTP APIs.
puffin-installer
Functionality for installing Python packages into a virtual environment.
puffin-interpreter
Functionality for detecting and leveraging the current Python interpreter.
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.
wheel-filename
Functionality for parsing wheel filenames as per PEP 427.