From db0de9e7cabc5e7bc052dfc4c8fc1b5dea154009 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 12 Mar 2004 08:41:36 +0000 Subject: 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')). --- Python/ceval.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 1e724c5..3c9076c 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: -- cgit v0.12