[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