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:
parent
674d56b82e
commit
7832cd6141
|
@ -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 */
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue