[Python-checkins] r59586 - python/trunk/Python/bltinmodule.c
guido.van.rossum
python-checkins at python.org
Fri Dec 21 00:48:28 CET 2007
Author: guido.van.rossum
Date: Fri Dec 21 00:48:28 2007
New Revision: 59586
Modified:
python/trunk/Python/bltinmodule.c
Log:
Improve performance of built-in any()/all() by avoiding PyIter_Next() --
using a trick found in ifilter().
Feel free to backport to 2.5.
Modified: python/trunk/Python/bltinmodule.c
==============================================================================
--- python/trunk/Python/bltinmodule.c (original)
+++ python/trunk/Python/bltinmodule.c Fri Dec 21 00:48:28 2007
@@ -78,13 +78,19 @@
builtin_all(PyObject *self, PyObject *v)
{
PyObject *it, *item;
+ PyObject *(*iternext)(PyObject *);
+ int cmp;
it = PyObject_GetIter(v);
if (it == NULL)
return NULL;
+ iternext = *Py_TYPE(it)->tp_iternext;
- while ((item = PyIter_Next(it)) != NULL) {
- int cmp = PyObject_IsTrue(item);
+ for (;;) {
+ item = iternext(it);
+ if (item == NULL)
+ break;
+ cmp = PyObject_IsTrue(item);
Py_DECREF(item);
if (cmp < 0) {
Py_DECREF(it);
@@ -96,8 +102,12 @@
}
}
Py_DECREF(it);
- if (PyErr_Occurred())
- return NULL;
+ if (PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_StopIteration))
+ PyErr_Clear();
+ else
+ return NULL;
+ }
Py_RETURN_TRUE;
}
@@ -110,13 +120,19 @@
builtin_any(PyObject *self, PyObject *v)
{
PyObject *it, *item;
+ PyObject *(*iternext)(PyObject *);
+ int cmp;
it = PyObject_GetIter(v);
if (it == NULL)
return NULL;
+ iternext = *Py_TYPE(it)->tp_iternext;
- while ((item = PyIter_Next(it)) != NULL) {
- int cmp = PyObject_IsTrue(item);
+ for (;;) {
+ item = iternext(it);
+ if (item == NULL)
+ break;
+ cmp = PyObject_IsTrue(item);
Py_DECREF(item);
if (cmp < 0) {
Py_DECREF(it);
@@ -128,8 +144,12 @@
}
}
Py_DECREF(it);
- if (PyErr_Occurred())
- return NULL;
+ if (PyErr_Occurred()) {
+ if (PyErr_ExceptionMatches(PyExc_StopIteration))
+ PyErr_Clear();
+ else
+ return NULL;
+ }
Py_RETURN_FALSE;
}
More information about the Python-checkins
mailing list