]> granicus.if.org Git - python/commitdiff
SF bug #604716: faster [None]*n or []*n
authorRaymond Hettinger <python@rcn.com>
Wed, 21 May 2003 05:58:46 +0000 (05:58 +0000)
committerRaymond Hettinger <python@rcn.com>
Wed, 21 May 2003 05:58:46 +0000 (05:58 +0000)
Fulfilled request to special case repetitions of lists of length 0 or 1.

Objects/listobject.c

index 48f3d7d6ea01ef3fe423cdd3e26faea687911322..7d03506412211e73ed3dce3e940e6e8e9abc6cfa 100644 (file)
@@ -421,14 +421,26 @@ list_repeat(PyListObject *a, int n)
        int size;
        PyListObject *np;
        PyObject **p;
+       PyObject *elem;
        if (n < 0)
                n = 0;
        size = a->ob_size * n;
+       if (size == 0)
+              return PyList_New(0);
        if (n && size/n != a->ob_size)
                return PyErr_NoMemory();
        np = (PyListObject *) PyList_New(size);
        if (np == NULL)
                return NULL;
+
+       if (a->ob_size == 1) {
+               elem = a->ob_item[0];
+               for (i = 0; i < n; i++) {
+                       np->ob_item[i] = elem;
+                       Py_INCREF(elem);
+               }
+               return (PyObject *) np;
+       }
        p = np->ob_item;
        for (i = 0; i < n; i++) {
                for (j = 0; j < a->ob_size; j++) {