Commit 7962b5e1 authored by Raymond Hettinger's avatar Raymond Hettinger

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.
parent e424c1d9
...@@ -342,7 +342,7 @@ static PyObject * ...@@ -342,7 +342,7 @@ static PyObject *
list_slice(PyListObject *a, int ilow, int ihigh) list_slice(PyListObject *a, int ilow, int ihigh)
{ {
PyListObject *np; PyListObject *np;
int i; int i, len;
if (ilow < 0) if (ilow < 0)
ilow = 0; ilow = 0;
else if (ilow > a->ob_size) else if (ilow > a->ob_size)
...@@ -351,13 +351,15 @@ list_slice(PyListObject *a, int ilow, int ihigh) ...@@ -351,13 +351,15 @@ list_slice(PyListObject *a, int ilow, int ihigh)
ihigh = ilow; ihigh = ilow;
else if (ihigh > a->ob_size) else if (ihigh > a->ob_size)
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) if (np == NULL)
return 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); Py_INCREF(v);
np->ob_item[i - ilow] = v; np->ob_item[i] = v;
} }
return (PyObject *)np; return (PyObject *)np;
} }
...@@ -676,10 +678,19 @@ listextend_internal(PyListObject *self, PyObject *b) ...@@ -676,10 +678,19 @@ listextend_internal(PyListObject *self, PyObject *b)
} }
/* populate the end of self with b's items */ /* populate the end of self with b's items */
for (i = 0; i < blen; i++) { if (PyList_Check(b)) {
PyObject *o = PySequence_Fast_GET_ITEM(b, i); for (i = 0; i < blen; i++) {
Py_INCREF(o); PyObject *o = PyList_GET_ITEM(b, i);
PyList_SET_ITEM(self, i+selflen, o); 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); Py_DECREF(b);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment