Skip to content

Commit b46ad54

Browse files
authored
Minor performance tweak for deque.index() with a start argument (GH-9440)
1 parent fb3e9c0 commit b46ad54

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

Lib/test/test_deque.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,14 @@ def test_index(self):
288288
else:
289289
self.assertEqual(d.index(element, start, stop), target)
290290

291+
# Test large start argument
292+
d = deque(range(0, 10000, 10))
293+
for step in range(100):
294+
i = d.index(8500, 700)
295+
self.assertEqual(d[i], 8500)
296+
# Repeat test with a different internal offset
297+
d.rotate()
298+
291299
def test_index_bug_24913(self):
292300
d = deque('A' * 3)
293301
with self.assertRaises(ValueError):

Modules/_collectionsmodule.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,8 +1050,10 @@ deque_index(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
10501050
start = stop;
10511051
assert(0 <= start && start <= stop && stop <= Py_SIZE(deque));
10521052

1053-
/* XXX Replace this loop with faster code from deque_item() */
1054-
for (i=0 ; i<start ; i++) {
1053+
for (i=0 ; i < start - BLOCKLEN ; i += BLOCKLEN) {
1054+
b = b->rightlink;
1055+
}
1056+
for ( ; i < start ; i++) {
10551057
index++;
10561058
if (index == BLOCKLEN) {
10571059
b = b->rightlink;

0 commit comments

Comments
 (0)