]> granicus.if.org Git - python/commitdiff
needforspeed: speed up upper and lower for 8-bit string objects.
authorFredrik Lundh <fredrik@pythonware.com>
Thu, 25 May 2006 15:22:03 +0000 (15:22 +0000)
committerFredrik Lundh <fredrik@pythonware.com>
Thu, 25 May 2006 15:22:03 +0000 (15:22 +0000)
(the unicode versions of these are still 2x faster on windows,
though...)

based on work by Andrew Dalke, with tweaks by yours truly.

Objects/stringobject.c

index f3104ee66c3860c0cae4ff425be7f28487ed5591..d3ab54e214ab66ff2131ae554130477168db905e 100644 (file)
@@ -2036,26 +2036,25 @@ Return a copy of the string S converted to lowercase.");
 static PyObject *
 string_lower(PyStringObject *self)
 {
-       char *s = PyString_AS_STRING(self), *s_new;
+       char *s;
        Py_ssize_t i, n = PyString_GET_SIZE(self);
        PyObject *newobj;
 
-       newobj = PyString_FromStringAndSize(NULL, n);
-       if (newobj == NULL)
+       newobj = PyString_FromStringAndSize(PyString_AS_STRING(self), n);
+       if (!newobj)
                return NULL;
-       s_new = PyString_AsString(newobj);
+
+       s = PyString_AS_STRING(newobj);
+
        for (i = 0; i < n; i++) {
-               int c = Py_CHARMASK(*s++);
-               if (isupper(c)) {
-                       *s_new = tolower(c);
-               } else
-                       *s_new = c;
-               s_new++;
+               char c = Py_CHARMASK(s[i]);
+               if (isupper(c))
+                       s[i] = _tolower(c);
        }
+
        return newobj;
 }
 
-
 PyDoc_STRVAR(upper__doc__,
 "S.upper() -> string\n\
 \n\
@@ -2064,26 +2063,25 @@ Return a copy of the string S converted to uppercase.");
 static PyObject *
 string_upper(PyStringObject *self)
 {
-       char *s = PyString_AS_STRING(self), *s_new;
+       char *s;
        Py_ssize_t i, n = PyString_GET_SIZE(self);
        PyObject *newobj;
 
-       newobj = PyString_FromStringAndSize(NULL, n);
-       if (newobj == NULL)
+       newobj = PyString_FromStringAndSize(PyString_AS_STRING(self), n);
+       if (!newobj)
                return NULL;
-       s_new = PyString_AsString(newobj);
+
+       s = PyString_AS_STRING(newobj);
+
        for (i = 0; i < n; i++) {
-               int c = Py_CHARMASK(*s++);
-               if (islower(c)) {
-                       *s_new = toupper(c);
-               } else
-                       *s_new = c;
-               s_new++;
+               char c = Py_CHARMASK(s[i]);
+               if (islower(c))
+                       s[i] = _toupper(c);
        }
+
        return newobj;
 }
 
-
 PyDoc_STRVAR(title__doc__,
 "S.title() -> string\n\
 \n\