summaryrefslogtreecommitdiffstats
path: root/Objects/listobject.c
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2004-03-08 07:25:05 (GMT)
committerRaymond Hettinger <python@rcn.com>2004-03-08 07:25:05 (GMT)
commitb7d05db0beacb9f24300d5fa26b14c3f73d6c622 (patch)
tree7e2c7f591d047fdd057b25dcff149f6e78f38e60 /Objects/listobject.c
parentf0e3569a28bc25cc3a6b267614b9724d8fe01a0e (diff)
downloadcpython-b7d05db0beacb9f24300d5fa26b14c3f73d6c622.zip
cpython-b7d05db0beacb9f24300d5fa26b14c3f73d6c622.tar.gz
cpython-b7d05db0beacb9f24300d5fa26b14c3f73d6c622.tar.bz2
Optimize tuple_slice() and make further improvements to list_slice()
and list.extend(). Factoring the inner loops to remove the constant structure references and fixed offsets gives speedups ranging from 20% to 30%.
Diffstat (limited to 'Objects/listobject.c')
-rw-r--r--Objects/listobject.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 0508d37..f5a9c7b 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -342,6 +342,7 @@ static PyObject *
list_slice(PyListObject *a, int ilow, int ihigh)
{
PyListObject *np;
+ PyObject **src, **dest;
int i, len;
if (ilow < 0)
ilow = 0;
@@ -356,10 +357,12 @@ list_slice(PyListObject *a, int ilow, int ihigh)
if (np == NULL)
return NULL;
+ src = a->ob_item + ilow;
+ dest = np->ob_item;
for (i = 0; i < len; i++) {
- PyObject *v = a->ob_item[i+ilow];
+ PyObject *v = src[i];
Py_INCREF(v);
- np->ob_item[i] = v;
+ dest[i] = v;
}
return (PyObject *)np;
}
@@ -646,6 +649,7 @@ listextend_internal(PyListObject *self, PyObject *b)
register int selflen = PyList_GET_SIZE(self);
int blen;
register int i;
+ PyObject **src, **dest;
if (PyObject_Size(b) == 0) {
/* short circuit when b is empty */
@@ -678,19 +682,17 @@ listextend_internal(PyListObject *self, PyObject *b)
}
/* populate the end of self with b's items */
- 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 {
+ if (PyList_Check(b))
+ src = ((PyListObject *)b)->ob_item;
+ 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);
- }
+ src = ((PyTupleObject *)b)->ob_item;
+ }
+ dest = self->ob_item + selflen;
+ for (i = 0; i < blen; i++) {
+ PyObject *o = src[i];
+ Py_INCREF(o);
+ dest[i] = o;
}
Py_DECREF(b);
return 0;