summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2004-03-08 05:56:15 (GMT)
committerRaymond Hettinger <python@rcn.com>2004-03-08 05:56:15 (GMT)
commit99842b65347b33af37d708b77c7d789909bacf9c (patch)
tree5c53edd64c563cd1f8f8f037e9a54d0d8199d98c
parentebedb2f773508ec50df1130bdd53b150a9fab84c (diff)
downloadcpython-99842b65347b33af37d708b77c7d789909bacf9c.zip
cpython-99842b65347b33af37d708b77c7d789909bacf9c.tar.gz
cpython-99842b65347b33af37d708b77c7d789909bacf9c.tar.bz2
Small optimizations for list_slice() and list_extend_internal().
* Using addition instead of substraction on array indices allows the compiler to use a fast addressing mode. Saves about 10%. * Using PyTuple_GET_ITEM and PyList_SET_ITEM is about 7% faster than PySequenceFast_GET_ITEM which has to make a list check on every pass.
-rw-r--r--Objects/listobject.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 162efa0..0508d37 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -342,7 +342,7 @@ static PyObject *
list_slice(PyListObject *a, int ilow, int ihigh)
{
PyListObject *np;
- int i;
+ int i, len;
if (ilow < 0)
ilow = 0;
else if (ilow > a->ob_size)
@@ -351,13 +351,15 @@ list_slice(PyListObject *a, int ilow, int ihigh)
ihigh = ilow;
else if (ihigh > a->ob_size)
ihigh = a->ob_size;
- np = (PyListObject *) PyList_New(ihigh - ilow);
+ len = ihigh - ilow;
+ np = (PyListObject *) PyList_New(len);
if (np == NULL)
return NULL;
- for (i = ilow; i < ihigh; i++) {
- PyObject *v = a->ob_item[i];
+
+ for (i = 0; i < len; i++) {
+ PyObject *v = a->ob_item[i+ilow];
Py_INCREF(v);
- np->ob_item[i - ilow] = v;
+ np->ob_item[i] = v;
}
return (PyObject *)np;
}
@@ -676,10 +678,19 @@ listextend_internal(PyListObject *self, PyObject *b)
}
/* populate the end of self with b's items */
- for (i = 0; i < blen; i++) {
- PyObject *o = PySequence_Fast_GET_ITEM(b, i);
- Py_INCREF(o);
- PyList_SET_ITEM(self, i+selflen, o);
+ if (PyList_Check(b)) {
+ for (i = 0; i < blen; i++) {
+ PyObject *o = PyList_GET_ITEM(b, i);
+ Py_INCREF(o);
+ PyList_SET_ITEM(self, i+selflen, o);
+ }
+ } else {
+ assert (PyTuple_Check(b));
+ for (i = 0; i < blen; i++) {
+ PyObject *o = PyTuple_GET_ITEM(b, i);
+ Py_INCREF(o);
+ PyList_SET_ITEM(self, i+selflen, o);
+ }
}
Py_DECREF(b);
return 0;