Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8805717

Browse files
committed
Revert part of 3471a3515827 that caused a performance regression
1 parent 4103e4d commit 8805717

1 file changed

Lines changed: 44 additions & 8 deletions

File tree

Modules/_collectionsmodule.c

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -403,10 +403,28 @@ deque_extend(dequeobject *deque, PyObject *iterable)
403403

404404
iternext = *Py_TYPE(it)->tp_iternext;
405405
while ((item = iternext(it)) != NULL) {
406-
if (deque_append_internal(deque, item, maxlen) < 0) {
407-
Py_DECREF(item);
408-
Py_DECREF(it);
409-
return NULL;
406+
if (deque->rightindex == BLOCKLEN - 1) {
407+
block *b = newblock();
408+
if (b == NULL) {
409+
Py_DECREF(item);
410+
Py_DECREF(it);
411+
return NULL;
412+
}
413+
b->leftlink = deque->rightblock;
414+
CHECK_END(deque->rightblock->rightlink);
415+
deque->rightblock->rightlink = b;
416+
deque->rightblock = b;
417+
MARK_END(b->rightlink);
418+
deque->rightindex = -1;
419+
}
420+
Py_SIZE(deque)++;
421+
deque->rightindex++;
422+
deque->rightblock->data[deque->rightindex] = item;
423+
if (NEEDS_TRIM(deque, maxlen)) {
424+
PyObject *olditem = deque_popleft(deque, NULL);
425+
Py_DECREF(olditem);
426+
} else {
427+
deque->state++;
410428
}
411429
}
412430
return finalize_iterator(it);
@@ -450,10 +468,28 @@ deque_extendleft(dequeobject *deque, PyObject *iterable)
450468

451469
iternext = *Py_TYPE(it)->tp_iternext;
452470
while ((item = iternext(it)) != NULL) {
453-
if (deque_appendleft_internal(deque, item, maxlen) < 0) {
454-
Py_DECREF(item);
455-
Py_DECREF(it);
456-
return NULL;
471+
if (deque->leftindex == 0) {
472+
block *b = newblock();
473+
if (b == NULL) {
474+
Py_DECREF(item);
475+
Py_DECREF(it);
476+
return NULL;
477+
}
478+
b->rightlink = deque->leftblock;
479+
CHECK_END(deque->leftblock->leftlink);
480+
deque->leftblock->leftlink = b;
481+
deque->leftblock = b;
482+
MARK_END(b->leftlink);
483+
deque->leftindex = BLOCKLEN;
484+
}
485+
Py_SIZE(deque)++;
486+
deque->leftindex--;
487+
deque->leftblock->data[deque->leftindex] = item;
488+
if (NEEDS_TRIM(deque, maxlen)) {
489+
PyObject *olditem = deque_pop(deque, NULL);
490+
Py_DECREF(olditem);
491+
} else {
492+
deque->state++;
457493
}
458494
}
459495
return finalize_iterator(it);

0 commit comments

Comments
 (0)