]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Apply tuple/list pre-sizing optimization to a broader class of objects.
authorRaymond Hettinger <python@rcn.com>
Sun, 4 Jan 2004 06:08:16 +0000 (06:08 +0000)
committerRaymond Hettinger <python@rcn.com>
Sun, 4 Jan 2004 06:08:16 +0000 (06:08 +0000)
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.

Objects/abstract.c
Objects/listobject.c

index 7e246dba896f8c758a26e05009ccc19e1838241c..1259ad48a2a8b3e62f3714a2c729199f6de6de62 100644 (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 */
index 47673be9770797459f967e52ae5e58b4982e389f..3397fbbf93d13818738b0449c52d51b43a35ea7c 100644 (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();