python / python/cpython

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

Abierto
#138,946 53 comentarios 0 reacciones 1 asignado Ver en GitHub

@tim-one ya está trabajando en esto.

Desde el 16/9/2025.

interpreter-core performance type-feature
Lenguaje dominante
Python
Estrellas
77.2k
Forks
35.9k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

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

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.