[Python-checkins] cpython: Revert part of 3471a3515827 that caused a performance regression

raymond.hettinger python-checkins at python.org
Mon Sep 12 01:46:08 EDT 2016


https://hg.python.org/cpython/rev/fdb5ae2f25c6
changeset:   103690:fdb5ae2f25c6
user:        Raymond Hettinger <python at rcn.com>
date:        Sun Sep 11 22:45:53 2016 -0700
summary:
  Revert part of 3471a3515827 that caused a performance regression

files:
  Modules/_collectionsmodule.c |  52 ++++++++++++++++++++---
  1 files changed, 44 insertions(+), 8 deletions(-)


diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -403,10 +403,28 @@
 
     iternext = *Py_TYPE(it)->tp_iternext;
     while ((item = iternext(it)) != NULL) {
-        if (deque_append_internal(deque, item, maxlen) < 0) {
-            Py_DECREF(item);
-            Py_DECREF(it);
-            return NULL;
+        if (deque->rightindex == BLOCKLEN - 1) {
+            block *b = newblock();
+            if (b == NULL) {
+                Py_DECREF(item);
+                Py_DECREF(it);
+                return NULL;
+            }
+            b->leftlink = deque->rightblock;
+            CHECK_END(deque->rightblock->rightlink);
+            deque->rightblock->rightlink = b;
+            deque->rightblock = b;
+            MARK_END(b->rightlink);
+            deque->rightindex = -1;
+        }
+        Py_SIZE(deque)++;
+        deque->rightindex++;
+        deque->rightblock->data[deque->rightindex] = item;
+        if (NEEDS_TRIM(deque, maxlen)) {
+            PyObject *olditem = deque_popleft(deque, NULL);
+            Py_DECREF(olditem);
+        } else {
+            deque->state++;
         }
     }
     return finalize_iterator(it);
@@ -450,10 +468,28 @@
 
     iternext = *Py_TYPE(it)->tp_iternext;
     while ((item = iternext(it)) != NULL) {
-        if (deque_appendleft_internal(deque, item, maxlen) < 0) {
-            Py_DECREF(item);
-            Py_DECREF(it);
-            return NULL;
+        if (deque->leftindex == 0) {
+            block *b = newblock();
+            if (b == NULL) {
+                Py_DECREF(item);
+                Py_DECREF(it);
+                return NULL;
+            }
+            b->rightlink = deque->leftblock;
+            CHECK_END(deque->leftblock->leftlink);
+            deque->leftblock->leftlink = b;
+            deque->leftblock = b;
+            MARK_END(b->leftlink);
+            deque->leftindex = BLOCKLEN;
+        }
+        Py_SIZE(deque)++;
+        deque->leftindex--;
+        deque->leftblock->data[deque->leftindex] = item;
+        if (NEEDS_TRIM(deque, maxlen)) {
+            PyObject *olditem = deque_pop(deque, NULL);
+            Py_DECREF(olditem);
+        } else {
+            deque->state++;
         }
     }
     return finalize_iterator(it);

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


More information about the Python-checkins mailing list