From: Raymond Hettinger Date: Fri, 12 Mar 2004 08:41:36 +0000 (+0000) Subject: Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests X-Git-Tag: v2.4a1~715 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=db0de9e7cabc5e7bc052dfc4c8fc1b5dea154009;p=thirdparty%2FPython%2Fcpython.git Speedup for-loops by inlining PyIter_Next(). Saves duplicate tests and a function call resulting in a 15% reduction of total loop overhead (as measured by timeit.Timer('pass')). --- diff --git a/Python/ceval.c b/Python/ceval.c index 1e724c5968b7..3c9076c6194f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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: