Skip to content

perf: Speed up wildcard comparison#1111

Merged
notatallshaw merged 6 commits intopypa:mainfrom
notatallshaw:speed-up-wildcard-comparison
Mar 9, 2026
Merged

perf: Speed up wildcard comparison#1111
notatallshaw merged 6 commits intopypa:mainfrom
notatallshaw:speed-up-wildcard-comparison

Conversation

@notatallshaw
Copy link
Copy Markdown
Member

Wildcard performance is very slow because it needs to do normalization and padding each run, we can speed that up by:

  1. Caching the spec-side canonicalize_version + _version_split result
  2. Replacing _pad_version with _left_pad, which only pads the prospective side (the right side was computed but never used)

This impacts equal wildcard (==V.*), not equal wildcard (!=V.*), and compatible version ~=V.N, I've added one benchmark for compatible version as it's the most complex single specifier and popular with some users.

@notatallshaw
Copy link
Copy Markdown
Member Author

Noticeable improvements anywhere this touches:

All benchmarks:

| Change   | Before [d35d6642]    | After [9f0e6a02]    |   Ratio | Benchmark (Parameter)                                                                                  |
|----------|----------------------|---------------------|---------|--------------------------------------------------------------------------------------------------------|
|          | 5.68±0.06ms          | 5.69±0.08ms         |    1    | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]             |
|          | 3.99±0.03ms          | 4.00±0.03ms         |    1    | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]             |
|          | 4.50±0.02ms          | 4.57±0.06ms         |    1.02 | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]             |
|          | 4.36±0.05ms          | 4.48±0.04ms         |    1.03 | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]             |
|          | 4.37±0.02ms          | 4.41±0.06ms         |    1.01 | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]             |
|          | 5.94±0.1ms           | 5.80±0.04ms         |    0.98 | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]              |
|          | 5.97±0.07ms          | 5.95±0.04ms         |    1    | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]              |
|          | 1.80±0.01ms          | 1.80±0.01ms         |    1    | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]                |
|          | 1.20±0.01ms          | 1.20±0.01ms         |    1    | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]                |
|          | 1.35±0.01ms          | 1.39±0.02ms         |    1.03 | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]                |
|          | 1.27±0.01ms          | 1.27±0.01ms         |    1    | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]                |
|          | 1.30±0.01ms          | 1.30±0.02ms         |    1    | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]                |
|          | 1.90±0.02ms          | 1.90±0.02ms         |    1    | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]                 |
|          | 1.80±0.03ms          | 1.81±0.02ms         |    1.01 | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]                 |
|          | 20.0±0.4ms           | 20.0±0.1ms          |    1    | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]    |
|          | 14.3±0.1ms           | 14.5±0.1ms          |    1.02 | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]    |
|          | 15.7±0.09ms          | 15.7±0.1ms          |    1    | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]    |
|          | 15.4±0.2ms           | 15.4±0.07ms         |    1    | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]    |
|          | 15.7±0.05ms          | 15.8±0.1ms          |    1.01 | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]    |
|          | 21.6±0.1ms           | 20.7±0.3ms          |    0.96 | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]     |
|          | 21.0±0.1ms           | 21.0±0.09ms         |    1    | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]     |
|          | 1.02±0.01ms          | 929±10μs            |    0.91 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]        |
| -        | 713±3μs              | 646±2μs             |    0.91 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]        |
|          | 771±5μs              | 708±9μs             |    0.92 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]        |
| -        | 722±6μs              | 640±10μs            |    0.89 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]        |
| -        | 714±6μs              | 640±5μs             |    0.9  | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]        |
|          | 1.11±0.01ms          | 1.01±0ms            |    0.91 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]         |
|          | 1.08±0.01ms          | 986±9μs             |    0.92 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]         |
|          | 2.15±0.02ms          | 2.18±0.02ms         |    1.01 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]            |
|          | 1.88±0.02ms          | 1.87±0.02ms         |    0.99 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]            |
|          | 2.10±0.02ms          | 2.12±0.01ms         |    1.01 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]            |
|          | 1.97±0.02ms          | 1.99±0.02ms         |    1.01 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]            |
|          | 1.97±0.02ms          | 2.00±0.02ms         |    1.02 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]            |
|          | 2.20±0.02ms          | 2.21±0.03ms         |    1    | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]             |
|          | 2.13±0.04ms          | 2.15±0.01ms         |    1.01 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]             |
|          | 9.22±0.07ms          | 8.52±0.05ms         |    0.92 | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]          |
| -        | 6.43±0.05ms          | 5.77±0.06ms         |    0.9  | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]          |
|          | 7.00±0.07ms          | 6.36±0.08ms         |    0.91 | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]          |
| -        | 6.67±0.03ms          | 5.93±0.08ms         |    0.89 | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]          |
| -        | 6.71±0.06ms          | 5.87±0.04ms         |    0.88 | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]          |
|          | 9.73±0.1ms           | 8.96±0.1ms          |    0.92 | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]           |
|          | 9.48±0.03ms          | 8.85±0.1ms          |    0.93 | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]           |
| -        | 2.61±0.01ms          | 1.74±0.01ms         |    0.66 | specifiers.TimeSpecSuite.time_contains_complex_warm [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]  |
| -        | 1.93±0.01ms          | 1.26±0.01ms         |    0.65 | specifiers.TimeSpecSuite.time_contains_complex_warm [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]  |
| -        | 2.14±0.01ms          | 1.45±0.01ms         |    0.68 | specifiers.TimeSpecSuite.time_contains_complex_warm [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]  |
| -        | 1.95±0.02ms          | 1.22±0.01ms         |    0.63 | specifiers.TimeSpecSuite.time_contains_complex_warm [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]  |
| -        | 1.95±0.02ms          | 1.22±0ms            |    0.63 | specifiers.TimeSpecSuite.time_contains_complex_warm [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]  |
| -        | 2.85±0.06ms          | 1.90±0.02ms         |    0.67 | specifiers.TimeSpecSuite.time_contains_complex_warm [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]   |
| -        | 2.72±0.02ms          | 1.84±0.01ms         |    0.68 | specifiers.TimeSpecSuite.time_contains_complex_warm [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]   |
| -        | 6.24±0.04ms          | 4.15±0.04ms         |    0.67 | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]          |
| -        | 4.35±0.03ms          | 2.76±0.02ms         |    0.64 | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]          |
| -        | 4.77±0.09ms          | 3.00±0.04ms         |    0.63 | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]          |
| -        | 4.46±0.02ms          | 2.71±0.01ms         |    0.61 | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]          |
| -        | 4.54±0.02ms          | 2.75±0.01ms         |    0.61 | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]          |
| -        | 6.78±0.09ms          | 4.40±0.02ms         |    0.65 | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]           |
| -        | 6.51±0.04ms          | 4.33±0.05ms         |    0.67 | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]           |
| -        | 1.70±0.01ms          | 917±7μs             |    0.54 | specifiers.TimeSpecSuite.time_filter_compatible_warm [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0] |
| -        | 1.27±0.02ms          | 714±6μs             |    0.56 | specifiers.TimeSpecSuite.time_filter_compatible_warm [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0] |
| -        | 1.48±0.02ms          | 840±10μs            |    0.57 | specifiers.TimeSpecSuite.time_filter_compatible_warm [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0] |
| -        | 1.30±0.01ms          | 677±6μs             |    0.52 | specifiers.TimeSpecSuite.time_filter_compatible_warm [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0] |
| -        | 1.30±0.01ms          | 697±3μs             |    0.54 | specifiers.TimeSpecSuite.time_filter_compatible_warm [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0] |
| -        | 1.79±0.02ms          | 1.02±0.01ms         |    0.57 | specifiers.TimeSpecSuite.time_filter_compatible_warm [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]  |
| -        | 1.78±0.02ms          | 971±3μs             |    0.55 | specifiers.TimeSpecSuite.time_filter_compatible_warm [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]  |
| -        | 1.99±0.02ms          | 1.23±0.02ms         |    0.62 | specifiers.TimeSpecSuite.time_filter_complex_cold [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]    |
| -        | 1.52±0.02ms          | 956±6μs             |    0.63 | specifiers.TimeSpecSuite.time_filter_complex_cold [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]    |
| -        | 1.74±0.01ms          | 1.12±0.01ms         |    0.65 | specifiers.TimeSpecSuite.time_filter_complex_cold [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]    |
| -        | 1.51±0.01ms          | 899±7μs             |    0.6  | specifiers.TimeSpecSuite.time_filter_complex_cold [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]    |
| -        | 1.54±0.02ms          | 919±3μs             |    0.6  | specifiers.TimeSpecSuite.time_filter_complex_cold [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]    |
| -        | 2.14±0.02ms          | 1.34±0.01ms         |    0.63 | specifiers.TimeSpecSuite.time_filter_complex_cold [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]     |
| -        | 2.09±0.02ms          | 1.32±0ms            |    0.63 | specifiers.TimeSpecSuite.time_filter_complex_cold [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]     |
| -        | 1.96±0.02ms          | 1.17±0.01ms         |    0.6  | specifiers.TimeSpecSuite.time_filter_complex_warm [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]    |
| -        | 1.49±0.01ms          | 916±3μs             |    0.62 | specifiers.TimeSpecSuite.time_filter_complex_warm [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]    |
| -        | 1.70±0.01ms          | 1.07±0.01ms         |    0.63 | specifiers.TimeSpecSuite.time_filter_complex_warm [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]    |
| -        | 1.48±0.02ms          | 863±10μs            |    0.58 | specifiers.TimeSpecSuite.time_filter_complex_warm [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]    |
| -        | 1.51±0.02ms          | 877±4μs             |    0.58 | specifiers.TimeSpecSuite.time_filter_complex_warm [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]    |
| -        | 2.13±0.04ms          | 1.28±0.01ms         |    0.6  | specifiers.TimeSpecSuite.time_filter_complex_warm [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]     |
| -        | 2.03±0.02ms          | 1.25±0.01ms         |    0.61 | specifiers.TimeSpecSuite.time_filter_complex_warm [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]     |
|          | 17.9±0.1μs           | 18.4±0.3μs          |    1.03 | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]     |
|          | 11.9±0.06μs          | 12.0±0.2μs          |    1.01 | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]     |
|          | 10.6±0.08μs          | 10.8±0.1μs          |    1.01 | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]     |
|          | 10.1±0.04μs          | 10.1±0.1μs          |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]     |
|          | 9.95±0.08μs          | 9.97±0.09μs         |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]     |
|          | 19.5±0.2μs           | 19.5±0.2μs          |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]      |
|          | 19.2±0.1μs           | 19.2±0.07μs         |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]      |
|          | 15.1±0.08μs          | 15.5±0.2μs          |    1.03 | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]     |
|          | 10.1±0.06μs          | 10.1±0.06μs         |    1    | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]     |
|          | 8.53±0.1μs           | 8.74±0.1μs          |    1.03 | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]     |
|          | 8.33±0.2μs           | 8.32±0.07μs         |    1    | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]     |
|          | 8.17±0.06μs          | 8.11±0.03μs         |    0.99 | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]     |
|          | 16.5±0.1μs           | 16.4±0.2μs          |    1    | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]      |
|          | 16.2±0.1μs           | 16.1±0.2μs          |    1    | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]      |
|          | 5.02±0.06μs          | 5.02±0.02μs         |    1    | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]               |
|          | 3.49±0.02μs          | 3.49±0.01μs         |    1    | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]               |
|          | 3.51±0.04μs          | 3.59±0.05μs         |    1.02 | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]               |
|          | 3.71±0.03μs          | 3.69±0.05μs         |    0.99 | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]               |
|          | 4.08±0.02μs          | 4.10±0.02μs         |    1.01 | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]               |
|          | 5.59±0.05μs          | 5.53±0.04μs         |    0.99 | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]                |
|          | 5.44±0.04μs          | 5.42±0.07μs         |    1    | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]                |
|          | 2.66±0.02ms          | 2.64±0.01ms         |    0.99 | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]            |
|          | 1.73±0.01ms          | 1.74±0.02ms         |    1.01 | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]            |
|          | 2.13±0.01ms          | 2.14±0.01ms         |    1    | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]            |
|          | 1.95±0.02ms          | 1.93±0.01ms         |    0.99 | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]            |
|          | 1.73±0.01ms          | 1.72±0.01ms         |    0.99 | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]            |
|          | 2.84±0.01ms          | 2.81±0.02ms         |    0.99 | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]             |
|          | 2.80±0.02ms          | 2.79±0.02ms         |    1    | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]             |
|          | 4.43±0.03ms          | 4.43±0.04ms         |    1    | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]                   |
|          | 2.97±0.01ms          | 2.97±0.01ms         |    1    | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]                   |
|          | 3.58±0.06ms          | 3.55±0.02ms         |    0.99 | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]                   |
|          | 3.35±0.03ms          | 3.35±0.03ms         |    1    | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]                   |
|          | 3.20±0.02ms          | 3.19±0.01ms         |    0.99 | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]                   |
|          | 4.71±0.02ms          | 4.71±0.02ms         |    1    | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]                    |
|          | 4.58±0.02ms          | 4.58±0.02ms         |    1    | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]                    |
|          | 2.77±0.02ms          | 2.78±0.05ms         |    1    | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]              |
|          | 2.03±0.01ms          | 2.04±0.02ms         |    1.01 | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]              |
|          | 2.30±0.01ms          | 2.31±0.03ms         |    1    | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]              |
|          | 2.33±0.02ms          | 2.36±0.05ms         |    1.01 | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]              |
|          | 2.34±0.02ms          | 2.34±0.01ms         |    1    | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]              |
|          | 3.58±0.07ms          | 3.54±0.02ms         |    0.99 | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]               |
|          | 3.29±0.02ms          | 3.33±0.02ms         |    1.01 | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]               |
|          | 2.20±0.02ms          | 2.21±0.03ms         |    1    | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]              |
|          | 1.66±0.01ms          | 1.67±0.01ms         |    1.01 | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]              |
|          | 1.91±0.02ms          | 1.91±0.05ms         |    1    | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]              |
|          | 1.95±0.01ms          | 1.97±0.04ms         |    1.01 | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]              |
|          | 1.96±0.02ms          | 1.95±0ms            |    0.99 | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]              |
|          | 2.86±0.05ms          | 2.87±0.03ms         |    1    | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]               |
|          | 2.57±0.01ms          | 2.63±0.04ms         |    1.02 | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]               |
|          | 4.34±0.03ms          | 4.30±0.02ms         |    0.99 | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]                    |
|          | 3.13±0.01ms          | 3.13±0.01ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]                    |
|          | 3.50±0.02ms          | 3.51±0.04ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]                    |
|          | 3.14±0.02ms          | 3.14±0.02ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]                    |
|          | 3.06±0.03ms          | 3.05±0.03ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]                    |
|          | 4.86±0.01ms          | 4.86±0.03ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]                     |
|          | 4.66±0.02ms          | 4.69±0.02ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]                     |

@notatallshaw notatallshaw merged commit e3af78f into pypa:main Mar 9, 2026
56 checks passed
ngoldbaum pushed a commit to ngoldbaum/packaging that referenced this pull request Apr 1, 2026
This was referenced Apr 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants