[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);