Commit 7832cd61 authored by Raymond Hettinger's avatar Raymond Hettinger

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.
parent 674d56b8
...@@ -1380,7 +1380,7 @@ PySequence_Tuple(PyObject *v) ...@@ -1380,7 +1380,7 @@ PySequence_Tuple(PyObject *v)
return NULL; return NULL;
/* Guess result size and allocate space. */ /* Guess result size and allocate space. */
n = PySequence_Size(v); n = PyObject_Size(v);
if (n < 0) { if (n < 0) {
PyErr_Clear(); PyErr_Clear();
n = 10; /* arbitrary */ n = 10; /* arbitrary */
......
...@@ -2266,15 +2266,11 @@ list_fill(PyListObject *result, PyObject *v) ...@@ -2266,15 +2266,11 @@ list_fill(PyListObject *result, PyObject *v)
return -1; return -1;
/* Guess a result list size. */ /* Guess a result list size. */
n = -1; /* unknown */ n = PyObject_Size(v);
if (PySequence_Check(v) && if (n < 0) {
v->ob_type->tp_as_sequence->sq_length) { PyErr_Clear();
n = PySequence_Size(v);
if (n < 0)
PyErr_Clear();
}
if (n < 0)
n = 8; /* arbitrary */ n = 8; /* arbitrary */
}
NRESIZE(result->ob_item, PyObject*, n); NRESIZE(result->ob_item, PyObject*, n);
if (result->ob_item == NULL) { if (result->ob_item == NULL) {
PyErr_NoMemory(); PyErr_NoMemory();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment