]> granicus.if.org Git - python/commitdiff
Apply map/zip pre-sizing optimization to a broader class of objects.
authorRaymond Hettinger <python@rcn.com>
Sun, 4 Jan 2004 08:54:44 +0000 (08:54 +0000)
committerRaymond Hettinger <python@rcn.com>
Sun, 4 Jan 2004 08:54:44 +0000 (08:54 +0000)
Formerly, the length was only fetched from sequence objects.
Now, any object that reports its length can benefit from pre-sizing.

Python/bltinmodule.c

index 314fb4e13b4bc2a573965cb0f03408e58ac91766..7fc6f572f458e6c6488fae9d05d8bcac43b2fc52 100644 (file)
@@ -791,17 +791,13 @@ builtin_map(PyObject *self, PyObject *args)
                }
 
                /* Update len. */
-               curlen = -1;  /* unknown */
-               if (PySequence_Check(curseq) &&
-                   curseq->ob_type->tp_as_sequence->sq_length) {
-                       curlen = PySequence_Size(curseq);
-                       if (curlen < 0)
-                               PyErr_Clear();
-               }
-               if (curlen < 0)
+               curlen = PyObject_Size(curseq);
+               if (curlen < 0) {
+                       PyErr_Clear();
                        curlen = 8;  /* arbitrary */
-                       if (curlen > len)
-                               len = curlen;
+               }
+               if (curlen > len)
+                       len = curlen;
        }
 
        /* Get space for the result list. */
@@ -1968,7 +1964,7 @@ builtin_zip(PyObject *self, PyObject *args)
        len = -1;       /* unknown */
        for (i = 0; i < itemsize; ++i) {
                PyObject *item = PyTuple_GET_ITEM(args, i);
-               int thislen = PySequence_Length(item);
+               int thislen = PyObject_Size(item);
                if (thislen < 0) {
                        PyErr_Clear();
                        len = -1;