[Python-checkins] cpython (3.3): cwr_next(): move invariants out of loops.

tim.peters python-checkins at python.org
Tue Sep 3 19:35:50 CEST 2013


http://hg.python.org/cpython/rev/4bbaa3d7bcbf
changeset:   85511:4bbaa3d7bcbf
branch:      3.3
parent:      85507:8e174ee0575a
user:        Tim Peters <tim at python.org>
date:        Tue Sep 03 11:49:31 2013 -0500
summary:
  cwr_next():  move invariants out of loops.

This simplifies and clarifies the code, and gives a small speedup.

files:
  Modules/itertoolsmodule.c |  28 +++++++++++---------------
  1 files changed, 12 insertions(+), 16 deletions(-)


diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -2713,20 +2713,20 @@
     PyObject *result = co->result;
     Py_ssize_t n = PyTuple_GET_SIZE(pool);
     Py_ssize_t r = co->r;
-    Py_ssize_t i, j, index;
+    Py_ssize_t i, index;
 
     if (co->stopped)
         return NULL;
 
     if (result == NULL) {
-        /* On the first pass, initialize result tuple using the indices */
+        /* On the first pass, initialize result tuple with pool[0] */
         result = PyTuple_New(r);
         if (result == NULL)
             goto empty;
         co->result = result;
+        elem = PyTuple_GET_ITEM(pool, 0);
         for (i=0; i<r ; i++) {
-            index = indices[i];
-            elem = PyTuple_GET_ITEM(pool, index);
+            assert(indices[i] == 0);
             Py_INCREF(elem);
             PyTuple_SET_ITEM(result, i, elem);
         }
@@ -2749,27 +2749,23 @@
            empty tuple is a singleton and cached in PyTuple's freelist. */
         assert(r == 0 || Py_REFCNT(result) == 1);
 
-    /* Scan indices right-to-left until finding one that is not
-     * at its maximum (n-1). */
+       /* Scan indices right-to-left until finding one that is not
+        * at its maximum (n-1). */
         for (i=r-1 ; i >= 0 && indices[i] == n-1; i--)
             ;
 
         /* If i is negative, then the indices are all at
-       their maximum value and we're done. */
+           their maximum value and we're done. */
         if (i < 0)
             goto empty;
 
         /* Increment the current index which we know is not at its
-       maximum.  Then set all to the right to the same value. */
-        indices[i]++;
-        for (j=i+1 ; j<r ; j++)
-            indices[j] = indices[j-1];
-
-        /* Update the result tuple for the new indices
-           starting with i, the leftmost index that changed */
+           maximum.  Then set all to the right to the same value. */
+        index = indices[i] + 1;
+        assert(index < n);
+        elem = PyTuple_GET_ITEM(pool, index);
         for ( ; i<r ; i++) {
-            index = indices[i];
-            elem = PyTuple_GET_ITEM(pool, index);
+            indices[i] = index;
             Py_INCREF(elem);
             oldelem = PyTuple_GET_ITEM(result, i);
             PyTuple_SET_ITEM(result, i, elem);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list