From: Raymond Hettinger Date: Wed, 17 Mar 2004 04:27:44 +0000 (+0000) Subject: Speedup the inner loops for dropwhile(), islice(), ifilter(), and X-Git-Tag: v2.4a1~689 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0faa1ca51d98b41fda4eb4fb25704981ea3bf2bb;p=python Speedup the inner loops for dropwhile(), islice(), ifilter(), and ifilterfalse(). --- diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 517975b367..3ad26d5b2c 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -835,10 +835,12 @@ dropwhile_next(dropwhileobject *lz) PyObject *item, *good; PyObject *it = lz->it; long ok; + PyObject *(*iternext)(PyObject *); + assert(PyIter_Check(it)); + iternext = *it->ob_type->tp_iternext; for (;;) { - assert(PyIter_Check(it)); - item = (*it->ob_type->tp_iternext)(it); + item = iternext(it); if (item == NULL) return NULL; if (lz->start == 1) @@ -1170,10 +1172,12 @@ islice_next(isliceobject *lz) PyObject *item; PyObject *it = lz->it; long oldnext; + PyObject *(*iternext)(PyObject *); + assert(PyIter_Check(it)); + iternext = *it->ob_type->tp_iternext; while (lz->cnt < lz->next) { - assert(PyIter_Check(it)); - item = (*it->ob_type->tp_iternext)(it); + item = iternext(it); if (item == NULL) return NULL; Py_DECREF(item); @@ -1182,7 +1186,7 @@ islice_next(isliceobject *lz) if (lz->stop != -1 && lz->cnt >= lz->stop) return NULL; assert(PyIter_Check(it)); - item = (*it->ob_type->tp_iternext)(it); + item = iternext(it); if (item == NULL) return NULL; lz->cnt++; @@ -1783,10 +1787,12 @@ ifilter_next(ifilterobject *lz) PyObject *item; PyObject *it = lz->it; long ok; + PyObject *(*iternext)(PyObject *); + assert(PyIter_Check(it)); + iternext = *it->ob_type->tp_iternext; for (;;) { - assert(PyIter_Check(it)); - item = (*it->ob_type->tp_iternext)(it); + item = iternext(it); if (item == NULL) return NULL; @@ -1932,10 +1938,12 @@ ifilterfalse_next(ifilterfalseobject *lz) PyObject *item; PyObject *it = lz->it; long ok; + PyObject *(*iternext)(PyObject *); + assert(PyIter_Check(it)); + iternext = *it->ob_type->tp_iternext; for (;;) { - assert(PyIter_Check(it)); - item = (*it->ob_type->tp_iternext)(it); + item = iternext(it); if (item == NULL) return NULL;