Apply tuple/list pre-sizing optimization to a broader class of objects.

Formerly, length data fetched from sequence objects.
Now, any object that reports its length can benefit from pre-sizing.

On one sample timing, it gave a threefold speedup for list(s) where s
was a set object.
This commit is contained in:
Raymond Hettinger 2004-01-04 06:08:16 +00:00
parent 674d56b82e
commit 7832cd6141
2 changed files with 5 additions and 9 deletions

View File

@ -1380,7 +1380,7 @@ PySequence_Tuple(PyObject *v)
return NULL;
/* Guess result size and allocate space. */
n = PySequence_Size(v);
n = PyObject_Size(v);
if (n < 0) {
PyErr_Clear();
n = 10; /* arbitrary */

View File

@ -2266,15 +2266,11 @@ list_fill(PyListObject *result, PyObject *v)
return -1;
/* Guess a result list size. */
n = -1; /* unknown */
if (PySequence_Check(v) &&
v->ob_type->tp_as_sequence->sq_length) {
n = PySequence_Size(v);
if (n < 0)
PyErr_Clear();
}
if (n < 0)
n = PyObject_Size(v);
if (n < 0) {
PyErr_Clear();
n = 8; /* arbitrary */
}
NRESIZE(result->ob_item, PyObject*, n);
if (result->ob_item == NULL) {
PyErr_NoMemory();