python / python/cpython

`list.sort` enhancement proposal: Adaptivity for `binarysort`

Offen
#138,946 53 Kommentare 0 Reaktionen 1 zugewiesene Person Auf GitHub ansehen

@tim-one arbeitet bereits daran.

Seit 16.9.2025.

interpreter-core performance type-feature
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
35.9k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Feature or enhancement

Proposal:

Adding adaptivity to binarysort routine of list.sort.

See PR for specifics.

Initial Post (Outdated)

Note:

  1. This is POC that this has a observable impact.
  2. This is subject to further calibration and optimizations, but high level concept is dicusable.
  3. Will issue PR shortly.
Rationale

Galloping provides adaptivity when merging runs.
However, underlying binarysort always does O(nlogn).

Concept

The concept is simple:

  1. binarysort optionally does adaptive routine.
    1. It has a mechanism to switch it off during the run and go to simple binarysort
    2. It returns 1 if it has completed full data with binary routine and 0 otherwise
  2. timsort calls binarysort
    1. If it returns 1, then use it again next time
    2. If it returns 0, then use binarysort without adaptivity next time
    3. increase number of simple binarysort runs before next attempt of adaptive run with every 0 returned
High level results
  • A0 is current
  • A1 is with adaptivity
  • P means performance / runtime
  • C means comparison count
  • Aggregate numbers for all datasets combined are in the title
  1. Plain integers and floats
Image
  1. Integers and floats wrapped in list, so comparisons are __lt__ calls, thus more expensive
Image

So the benefit is higher when comparisons cost more.
But there is some benefit for optimized comparisons as well.

Has this already been discussed elsewhere?

I have already discussed this feature proposal on Discourse

Links to previous discussion of this feature:

https://discuss.python.org/t/sorting-adaptivity-improvement/103700

Linked PRs
  • gh-138947
  • gh-139342
  • gh-139969

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.