From: Raymond Hettinger Date: Sat, 15 Dec 2007 00:07:25 +0000 (+0000) Subject: Optimize PyList_AsTuple(). Improve cache performance by doing the X-Git-Tag: v2.6a1~859 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c87af5d876dca978199240c258eaaaf2d0040e9;p=python Optimize PyList_AsTuple(). Improve cache performance by doing the pointer copy and object increment in one pass. For small lists, save the overhead of the call to memcpy() -- this comes up in calls like f(*listcomp). --- diff --git a/Objects/listobject.c b/Objects/listobject.c index ca767da9dc..3fa256ed64 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2186,7 +2186,7 @@ PyObject * PyList_AsTuple(PyObject *v) { PyObject *w; - PyObject **p; + PyObject **p, **q; Py_ssize_t n; if (v == NULL || !PyList_Check(v)) { PyErr_BadInternalCall(); @@ -2197,12 +2197,12 @@ PyList_AsTuple(PyObject *v) if (w == NULL) return NULL; p = ((PyTupleObject *)w)->ob_item; - memcpy((void *)p, - (void *)((PyListObject *)v)->ob_item, - n*sizeof(PyObject *)); + q = ((PyListObject *)v)->ob_item; while (--n >= 0) { - Py_INCREF(*p); + Py_INCREF(*q); + *p = *q; p++; + q++; } return w; }