[Python-checkins] python/dist/src/Objects listobject.c, 2.187,
2.188 tupleobject.c, 2.83, 2.84
rhettinger at users.sourceforge.net
rhettinger at users.sourceforge.net
Tue Mar 9 08:05:25 EST 2004
Update of /cvsroot/python/python/dist/src/Objects
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8358
Modified Files:
listobject.c tupleobject.c
Log Message:
Optimize inner loops for subscript, repeat, and concat.
Index: listobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/listobject.c,v
retrieving revision 2.187
retrieving revision 2.188
diff -C2 -d -r2.187 -r2.188
*** listobject.c 9 Mar 2004 08:04:33 -0000 2.187
--- listobject.c 9 Mar 2004 13:05:06 -0000 2.188
***************
*** 383,386 ****
--- 383,387 ----
int size;
int i;
+ PyObject **src, **dest;
PyListObject *np;
if (!PyList_Check(bb)) {
***************
*** 398,410 ****
return NULL;
}
for (i = 0; i < a->ob_size; i++) {
! PyObject *v = a->ob_item[i];
Py_INCREF(v);
! np->ob_item[i] = v;
}
for (i = 0; i < b->ob_size; i++) {
! PyObject *v = b->ob_item[i];
Py_INCREF(v);
! np->ob_item[i + a->ob_size] = v;
}
return (PyObject *)np;
--- 399,415 ----
return NULL;
}
+ src = a->ob_item;
+ dest = np->ob_item;
for (i = 0; i < a->ob_size; i++) {
! PyObject *v = src[i];
Py_INCREF(v);
! dest[i] = v;
}
+ src = b->ob_item;
+ dest = np->ob_item + a->ob_size;
for (i = 0; i < b->ob_size; i++) {
! PyObject *v = src[i];
Py_INCREF(v);
! dest[i] = v;
}
return (PyObject *)np;
***************
*** 418,422 ****
int size;
PyListObject *np;
! PyObject **p;
PyObject *elem;
if (n < 0)
--- 423,427 ----
int size;
PyListObject *np;
! PyObject **p, **items;
PyObject *elem;
if (n < 0)
***************
*** 431,438 ****
return NULL;
if (a->ob_size == 1) {
elem = a->ob_item[0];
for (i = 0; i < n; i++) {
! np->ob_item[i] = elem;
Py_INCREF(elem);
}
--- 436,444 ----
return NULL;
+ items = np->ob_item;
if (a->ob_size == 1) {
elem = a->ob_item[0];
for (i = 0; i < n; i++) {
! items[i] = elem;
Py_INCREF(elem);
}
***************
*** 440,446 ****
}
p = np->ob_item;
for (i = 0; i < n; i++) {
for (j = 0; j < a->ob_size; j++) {
! *p = a->ob_item[j];
Py_INCREF(*p);
p++;
--- 446,453 ----
}
p = np->ob_item;
+ items = a->ob_item;
for (i = 0; i < n; i++) {
for (j = 0; j < a->ob_size; j++) {
! *p = items[j];
Py_INCREF(*p);
p++;
***************
*** 591,599 ****
p = size;
for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
for (j = 0; j < size; j++) {
! PyObject *o = PyList_GET_ITEM(self, j);
Py_INCREF(o);
! PyList_SET_ITEM(self, p++, o);
}
}
--- 598,607 ----
p = size;
+ items = self->ob_item;
for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
for (j = 0; j < size; j++) {
! PyObject *o = items[j];
Py_INCREF(o);
! items[p++] = o;
}
}
***************
*** 2405,2408 ****
--- 2413,2417 ----
PyObject* result;
PyObject* it;
+ PyObject **src, **dest;
if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
***************
*** 2418,2426 ****
if (!result) return NULL;
for (cur = start, i = 0; i < slicelength;
cur += step, i++) {
! it = PyList_GET_ITEM(self, cur);
Py_INCREF(it);
! PyList_SET_ITEM(result, i, it);
}
--- 2427,2437 ----
if (!result) return NULL;
+ src = self->ob_item;
+ dest = ((PyListObject *)result)->ob_item;
for (cur = start, i = 0; i < slicelength;
cur += step, i++) {
! it = src[cur];
Py_INCREF(it);
! dest[i] = it;
}
***************
*** 2467,2471 ****
/* delete slice */
PyObject **garbage;
! int cur, i, j;
if (slicelength <= 0)
--- 2478,2482 ----
/* delete slice */
PyObject **garbage;
! int cur, i;
if (slicelength <= 0)
***************
*** 2494,2503 ****
}
! for (j = 0; j < lim; j++) {
! PyList_SET_ITEM(self, cur + j - i,
! PyList_GET_ITEM(self,
! cur + j + 1));
! }
}
for (cur = start + slicelength*step + 1;
cur < self->ob_size; cur++) {
--- 2505,2513 ----
}
! memmove(self->ob_item + cur - i,
! self->ob_item + cur + 1,
! lim * sizeof(PyObject *));
}
+
for (cur = start + slicelength*step + 1;
cur < self->ob_size; cur++) {
***************
*** 2505,2508 ****
--- 2515,2519 ----
PyList_GET_ITEM(self, cur));
}
+
self->ob_size -= slicelength;
list_resize(self, self->ob_size);
***************
*** 2517,2521 ****
else {
/* assign slice */
! PyObject **garbage, *ins, *seq;
int cur, i;
--- 2528,2532 ----
else {
/* assign slice */
! PyObject **garbage, *ins, *seq, **seqitems, **selfitems;
int cur, i;
***************
*** 2526,2534 ****
}
else {
! char msg[256];
! PyOS_snprintf(msg, sizeof(msg),
! "must assign sequence (not \"%.200s\") to extended slice",
! value->ob_type->tp_name);
! seq = PySequence_Fast(value, msg);
if (!seq)
return -1;
--- 2537,2542 ----
}
else {
! seq = PySequence_Fast(value,
! "must assign iterable to extended slice");
if (!seq)
return -1;
***************
*** 2552,2562 ****
PyMem_MALLOC(slicelength*sizeof(PyObject*));
for (cur = start, i = 0; i < slicelength;
cur += step, i++) {
! garbage[i] = PyList_GET_ITEM(self, cur);
!
! ins = PySequence_Fast_GET_ITEM(seq, i);
Py_INCREF(ins);
! PyList_SET_ITEM(self, cur, ins);
}
--- 2560,2574 ----
PyMem_MALLOC(slicelength*sizeof(PyObject*));
+ selfitems = self->ob_item;
+ if (PyList_Check(seq))
+ seqitems = ((PyListObject *)seq)->ob_item;
+ else
+ seqitems = ((PyTupleObject *)seq)->ob_item;
for (cur = start, i = 0; i < slicelength;
cur += step, i++) {
! garbage[i] = selfitems[cur];
! ins = seqitems[i];
Py_INCREF(ins);
! selfitems[cur] = ins;
}
Index: tupleobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/tupleobject.c,v
retrieving revision 2.83
retrieving revision 2.84
diff -C2 -d -r2.83 -r2.84
*** tupleobject.c 8 Mar 2004 07:25:04 -0000 2.83
--- tupleobject.c 9 Mar 2004 13:05:22 -0000 2.84
***************
*** 137,140 ****
--- 137,141 ----
PyObject *o;
PyObject *result;
+ PyObject **items;
va_list vargs;
***************
*** 143,150 ****
if (result == NULL)
return NULL;
for (i = 0; i < n; i++) {
o = va_arg(vargs, PyObject *);
Py_INCREF(o);
! PyTuple_SET_ITEM(result, i, o);
}
va_end(vargs);
--- 144,152 ----
if (result == NULL)
return NULL;
+ items = ((PyTupleObject *)result)->ob_item;
for (i = 0; i < n; i++) {
o = va_arg(vargs, PyObject *);
Py_INCREF(o);
! items[i] = o;
}
va_end(vargs);
***************
*** 349,352 ****
--- 351,355 ----
register int size;
register int i;
+ PyObject **src, **dest;
PyTupleObject *np;
if (!PyTuple_Check(bb)) {
***************
*** 364,376 ****
return NULL;
}
for (i = 0; i < a->ob_size; i++) {
! PyObject *v = a->ob_item[i];
Py_INCREF(v);
! np->ob_item[i] = v;
}
for (i = 0; i < b->ob_size; i++) {
! PyObject *v = b->ob_item[i];
Py_INCREF(v);
! np->ob_item[i + a->ob_size] = v;
}
return (PyObject *)np;
--- 367,383 ----
return NULL;
}
+ src = a->ob_item;
+ dest = np->ob_item;
for (i = 0; i < a->ob_size; i++) {
! PyObject *v = src[i];
Py_INCREF(v);
! dest[i] = v;
}
+ src = b->ob_item;
+ dest = np->ob_item + a->ob_size;
for (i = 0; i < b->ob_size; i++) {
! PyObject *v = src[i];
Py_INCREF(v);
! dest[i] = v;
}
return (PyObject *)np;
***************
*** 384,388 ****
int size;
PyTupleObject *np;
! PyObject **p;
if (n < 0)
n = 0;
--- 391,395 ----
int size;
PyTupleObject *np;
! PyObject **p, **items;
if (n < 0)
n = 0;
***************
*** 404,410 ****
return NULL;
p = np->ob_item;
for (i = 0; i < n; i++) {
for (j = 0; j < a->ob_size; j++) {
! *p = a->ob_item[j];
Py_INCREF(*p);
p++;
--- 411,418 ----
return NULL;
p = np->ob_item;
+ items = a->ob_item;
for (i = 0; i < n; i++) {
for (j = 0; j < a->ob_size; j++) {
! *p = items[j];
Py_INCREF(*p);
p++;
***************
*** 585,588 ****
--- 593,597 ----
PyObject* result;
PyObject* it;
+ PyObject **src, **dest;
if (PySlice_GetIndicesEx((PySliceObject*)item,
***************
*** 598,606 ****
result = PyTuple_New(slicelength);
for (cur = start, i = 0; i < slicelength;
cur += step, i++) {
! it = PyTuple_GET_ITEM(self, cur);
Py_INCREF(it);
! PyTuple_SET_ITEM(result, i, it);
}
--- 607,617 ----
result = PyTuple_New(slicelength);
+ src = self->ob_item;
+ dest = ((PyTupleObject *)result)->ob_item;
for (cur = start, i = 0; i < slicelength;
cur += step, i++) {
! it = src[cur];
Py_INCREF(it);
! dest[i] = it;
}
More information about the Python-checkins
mailing list