]> granicus.if.org Git - python/commitdiff
Now that list.extend() is at the root of many list operations, it becomes
authorRaymond Hettinger <python@rcn.com>
Thu, 11 Mar 2004 09:48:18 +0000 (09:48 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 11 Mar 2004 09:48:18 +0000 (09:48 +0000)
worth it to in-line the call to PyIter_Next().

Saves another 15% on most list operations that acceptable a general
iterable argument (such as the list constructor).

Objects/listobject.c

index ed6ed3e56108f8f2903f01ee56813e95b9a7e1e6..2f2097d0d5aac0b766c7a7f9a2296316e06128c8 100644 (file)
@@ -715,6 +715,7 @@ listextend(PyListObject *self, PyObject *b)
        int n;             /* guess for size of b */
        int mn;            /* m + n */
        int i;
+       PyObject *(*iternext)(PyObject *);
 
        /* Special cases:
           1) lists and tuples which can use PySequence_Fast ops 
@@ -732,6 +733,7 @@ listextend(PyListObject *self, PyObject *b)
        it = PyObject_GetIter(b);
        if (it == NULL)
                return NULL;
+       iternext = *it->ob_type->tp_iternext;
 
        /* Guess a result list size. */
        n = PyObject_Size(b);
@@ -747,10 +749,14 @@ listextend(PyListObject *self, PyObject *b)
 
        /* Run iterator to exhaustion. */
        for (i = m; ; i++) {
-               PyObject *item = PyIter_Next(it);
+               PyObject *item = iternext(it);
                if (item == NULL) {
-                       if (PyErr_Occurred())
-                               goto error;
+                       if (PyErr_Occurred()) {
+                               if (PyErr_ExceptionMatches(PyExc_StopIteration))
+                                       PyErr_Clear();
+                               else
+                                       goto error;
+                       }
                        break;
                }
                if (i < mn)