@@ -1905,7 +1905,7 @@ abinarysort(MergeState *ms, const sortslice *ss, Py_ssize_t n, Py_ssize_t ok, in
19051905 Py_ssize_t last = ok >> 1 ;
19061906 Py_ssize_t std = ok >> 2 ;
19071907 Py_ssize_t mu = last ;
1908- Py_ssize_t nb = 0 ; // badness of fit
1908+ Py_ssize_t nbad = 0 ; // badness of fit
19091909
19101910 if (adapt ) {
19111911 for (; ok < n ; ++ ok ) {
@@ -1983,7 +1983,7 @@ abinarysort(MergeState *ms, const sortslice *ss, Py_ssize_t n, Py_ssize_t ok, in
19831983
19841984 // Update Adaptive runvars
19851985 std = L < mu ? mu - L : L - mu ;
1986- nb += std ;
1986+ nbad += std ;
19871987 mu = L + L - last ;
19881988 mu = mu < 0 ? 0 : mu > ok ? ok : mu ;
19891989 last = L ;
@@ -2016,15 +2016,15 @@ abinarysort(MergeState *ms, const sortslice *ss, Py_ssize_t n, Py_ssize_t ok, in
20162016
20172017 // Update Adaptive runvars
20182018 std = L < mu ? mu - L : L - mu ;
2019- nb += std ;
2019+ nbad += std ;
20202020 mu = L + L - last ;
20212021 mu = mu < 0 ? 0 : mu > ok ? ok : mu ;
20222022 last = L ;
20232023 }
20242024 }
20252025
20262026 // Return Adaptivity measure (max 1000)
2027- return nb * 2000 / ((n + 2 * nsorted - 1 ) * n );
2027+ return nbad * 2000 / ((n + 2 * nsorted - 1 ) * n );
20282028
20292029 fail :
20302030 return -1 ;
@@ -3221,9 +3221,10 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
32213221 // NOTE: Could turn on based on minlen or comparison type
32223222 int binary_adapt = ms .listlen >= 100 ;
32233223 if (binary_adapt ) {
3224- int adapt = 0 ; // do not run binarysort adaptivity on 1st run
3225- Py_ssize_t cs = 0 ;
3224+ int adapt = 0 ; // do not run binarysort adaptivity on 1st run
3225+ Py_ssize_t cs = 0 ; // but do check goodness of adaptive fit
32263226 Py_ssize_t cd = 1 ;
3227+ Py_ssize_t abinres ;
32273228 do {
32283229 /* Identify next run. */
32293230 Py_ssize_t n ;
@@ -3241,26 +3242,24 @@ list_sort_impl(PyListObject *self, PyObject *keyfunc, int reverse)
32413242 cs -= 1 ;
32423243 }
32433244 else {
3244- Py_ssize_t bres ;
3245- bres = abinarysort (& ms , & lo , force , n , adapt );
3246- if (bres < 0 )
3245+ abinres = abinarysort (& ms , & lo , force , n , adapt );
3246+ if (abinres < 0 )
32473247 goto fail ;
3248- adapt = bres < 250 ;
3249- if (adapt ) {
3248+ adapt = abinres < 250 ;
3249+ if (adapt )
32503250 cd = 1 ;
3251- }
3252- else {
3253- cd += 2 ;
3254- if (cd > 11 )
3255- cd = 11 ;
3256- cs = cd ;
3257- }
3251+ else if (cd >= 9 )
3252+ cs = cd = 11 ;
3253+ else
3254+ cs = cd = cd + 2 ;
32583255 }
32593256 n = force ;
32603257 }
32613258 else {
32623259 // After long monotonic run start adapting immediately
32633260 adapt = 1 ;
3261+ cs = 0 ;
3262+ cd = 1 ;
32643263 }
32653264 /* Maybe merge pending runs. */
32663265 assert (ms .n == 0 || ms .pending [ms .n - 1 ].base .keys +
0 commit comments