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).
This commit is contained in:
parent
c67a15d865
commit
6c87af5d87
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue