[Python-checkins] python/dist/src/Python bltinmodule.c,2.253,2.254

tim_one@sourceforge.net tim_one@sourceforge.net
2002年4月29日 14:27:34 -0700


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv17494/python/Python
Modified Files:
	bltinmodule.c 
Log Message:
builtin_zip(): Take a good guess at how big the result list will be,
and allocate it in one gulp.
This isn't a bugfix, it's just a minor optimization that may or may not
pay off.
Index: bltinmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/bltinmodule.c,v
retrieving revision 2.253
retrieving revision 2.254
diff -C2 -d -r2.253 -r2.254
*** bltinmodule.c	27 Apr 2002 18:44:32 -0000	2.253
--- bltinmodule.c	29 Apr 2002 21:27:32 -0000	2.254
***************
*** 382,386 ****
 	PyCompilerFlags cf;
 
! 	if (!PyArg_ParseTuple(args, "sss|ii:compile", &str, &filename, 
 			 &startstr, &supplied_flags, &dont_inherit))
 		return NULL;
--- 382,386 ----
 	PyCompilerFlags cf;
 
! 	if (!PyArg_ParseTuple(args, "sss|ii:compile", &str, &filename,
 			 &startstr, &supplied_flags, &dont_inherit))
 		return NULL;
***************
*** 1129,1133 ****
 	else if (!PyArg_ParseTuple(args, "O:min/max", &v))
 		return NULL;
! 	
 	it = PyObject_GetIter(v);
 	if (it == NULL)
--- 1129,1133 ----
 	else if (!PyArg_ParseTuple(args, "O:min/max", &v))
 		return NULL;
! 
 	it = PyObject_GetIter(v);
 	if (it == NULL)
***************
*** 1705,1711 ****
 {
 	PyObject *ret;
! 	int itemsize = PySequence_Length(args);
 	int i;
 	PyObject *itlist; /* tuple of iterators */
 
 	if (itemsize < 1) {
--- 1705,1712 ----
 {
 	PyObject *ret;
! 	const int itemsize = PySequence_Length(args);
 	int i;
 	PyObject *itlist; /* tuple of iterators */
+ 	int len;	 /* guess at result length */
 
 	if (itemsize < 1) {
***************
*** 1717,1722 ****
 	assert(PyTuple_Check(args));
 
 	/* allocate result list */
! 	if ((ret = PyList_New(0)) == NULL)
 		return NULL;
 
--- 1718,1736 ----
 	assert(PyTuple_Check(args));
 
+ 	/* Guess at result length: the shortest of the input lengths. */
+ 	len = -1;	/* unknown */
+ 	for (i = 0; i < itemsize; ++i) {
+ 		PyObject *item = PyTuple_GET_ITEM(args, i);
+ 		int thislen = PySequence_Length(item);
+ 		if (thislen < 0)
+ 			PyErr_Clear();
+ 		else if (len < 0 || thislen < len)
+ 			len = thislen;
+ 	}
+ 
 	/* allocate result list */
! 	if (len < 0)
! 		len = 10;	/* arbitrary */
! 	if ((ret = PyList_New(len)) == NULL)
 		return NULL;
 
***************
*** 1739,1750 ****
 
 	/* build result into ret list */
! 	for (;;) {
! 		int status;
 		PyObject *next = PyTuple_New(itemsize);
 		if (!next)
 			goto Fail_ret_itlist;
 
! 		for (i = 0; i < itemsize; i++) {
! 			PyObject *it = PyTuple_GET_ITEM(itlist, i);
 			PyObject *item = PyIter_Next(it);
 			if (!item) {
--- 1753,1764 ----
 
 	/* build result into ret list */
! 	for (i = 0; ; ++i) {
! 		int j;
 		PyObject *next = PyTuple_New(itemsize);
 		if (!next)
 			goto Fail_ret_itlist;
 
! 		for (j = 0; j < itemsize; j++) {
! 			PyObject *it = PyTuple_GET_ITEM(itlist, j);
 			PyObject *item = PyIter_Next(it);
 			if (!item) {
***************
*** 1755,1768 ****
 				Py_DECREF(next);
 				Py_DECREF(itlist);
! 				return ret;
 			}
! 			PyTuple_SET_ITEM(next, i, item);
 		}
 
! 		status = PyList_Append(ret, next);
! 		Py_DECREF(next);
! 		if (status < 0)
! 			goto Fail_ret_itlist;
 	}
 
 Fail_ret_itlist:
--- 1769,1795 ----
 				Py_DECREF(next);
 				Py_DECREF(itlist);
! 				goto Done;
 			}
! 			PyTuple_SET_ITEM(next, j, item);
 		}
 
! 		if (i < len)
! 			PyList_SET_ITEM(ret, i, next);
! 		else {
! 			int status = PyList_Append(ret, next);
! 			Py_DECREF(next);
! 			++len;
! 			if (status < 0)
! 				goto Fail_ret_itlist;
! 		}
! 	}
! 
! Done:
! 	if (ret != NULL && i < len) {
! 		/* The list is too big. */
! 		if (PyList_SetSlice(ret, i, len, NULL) < 0)
! 			return NULL;
 	}
+ 	return ret;
 
 Fail_ret_itlist:
***************
*** 1865,1869 ****
 #endif
 	SETBUILTIN("dict",		&PyDict_Type);
! 	SETBUILTIN("enumerate",		&PyEnum_Type);	
 	SETBUILTIN("float",		&PyFloat_Type);
 	SETBUILTIN("property",		&PyProperty_Type);
--- 1892,1896 ----
 #endif
 	SETBUILTIN("dict",		&PyDict_Type);
! 	SETBUILTIN("enumerate",		&PyEnum_Type);
 	SETBUILTIN("float",		&PyFloat_Type);
 	SETBUILTIN("property",		&PyProperty_Type);

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