]> granicus.if.org Git - python/commitdiff
Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests
authorRaymond Hettinger <python@rcn.com>
Fri, 12 Mar 2004 08:41:36 +0000 (08:41 +0000)
committerRaymond Hettinger <python@rcn.com>
Fri, 12 Mar 2004 08:41:36 +0000 (08:41 +0000)
and a function call resulting in a 15% reduction of total loop overhead
(as measured by timeit.Timer('pass')).

Python/ceval.c

index 1e724c5968b78c0113f2429d210232928a2dcaba..3c9076c6194f5e5055d2a977306d2b802993ab63 100644 (file)
@@ -2091,21 +2091,23 @@ eval_frame(PyFrameObject *f)
                case FOR_ITER:
                        /* before: [iter]; after: [iter, iter()] *or* [] */
                        v = TOP();
-                       x = PyIter_Next(v);
+                       x = (*v->ob_type->tp_iternext)(v);
                        if (x != NULL) {
                                PUSH(x);
                                PREDICT(STORE_FAST);
                                PREDICT(UNPACK_SEQUENCE);
                                continue;
                        }
-                       if (!PyErr_Occurred()) {
-                               /* iterator ended normally */
-                               x = v = POP();
-                               Py_DECREF(v);
-                               JUMPBY(oparg);
-                               continue;
+                       if (PyErr_Occurred()) {
+                               if (!PyErr_ExceptionMatches(PyExc_StopIteration))
+                                       break;
+                               PyErr_Clear();
                        }
-                       break;
+                       /* iterator ended normally */
+                       x = v = POP();
+                       Py_DECREF(v);
+                       JUMPBY(oparg);
+                       continue;
 
                case SETUP_LOOP:
                case SETUP_EXCEPT: