From 6c87af5d876dca978199240c258eaaaf2d0040e9 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 15 Dec 2007 00:07:25 +0000 Subject: [PATCH] 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). --- Objects/listobject.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Objects/listobject.c b/Objects/listobject.c index ca767da9dcc..3fa256ed646 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; }