]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Minor performance tweak for deque.index() with a start argument (GH-9440)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Fri, 21 Sep 2018 08:46:41 +0000 (01:46 -0700)
committerGitHub <noreply@github.com>
Fri, 21 Sep 2018 08:46:41 +0000 (01:46 -0700)
Lib/test/test_deque.py
Modules/_collectionsmodule.c

index 921136069d77224f575dab13dc5ac2bc1304283c..51b66b76aca91d03540db2e05aa80e7fc55af073 100644 (file)
@@ -288,6 +288,14 @@ class TestBasic(unittest.TestCase):
                     else:
                         self.assertEqual(d.index(element, start, stop), target)
 
+        # Test large start argument
+        d = deque(range(0, 10000, 10))
+        for step in range(100):
+            i = d.index(8500, 700)
+            self.assertEqual(d[i], 8500)
+            # Repeat test with a different internal offset
+            d.rotate()
+
     def test_index_bug_24913(self):
         d = deque('A' * 3)
         with self.assertRaises(ValueError):
index 935b4348a8ff8bb978861698a31f234d3e1b71da..267cf07f1f72a30921f8503b9cc30e1d8d6f6293 100644 (file)
@@ -1050,8 +1050,10 @@ deque_index(dequeobject *deque, PyObject *const *args, Py_ssize_t nargs)
         start = stop;
     assert(0 <= start && start <= stop && stop <= Py_SIZE(deque));
 
-    /* XXX Replace this loop with faster code from deque_item() */
-    for (i=0 ; i<start ; i++) {
+    for (i=0 ; i < start - BLOCKLEN ; i += BLOCKLEN) {
+        b = b->rightlink;
+    }
+    for ( ; i < start ; i++) {
         index++;
         if (index == BLOCKLEN) {
             b = b->rightlink;