[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