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.
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 47673be..3397fbb 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -2266,15 +2266,11 @@
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();