[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

AltStyle によって変換されたページ (->オリジナル) /