Mercurial > cpython-lru_cache-weakref
diff Objects/unicodeobject.c @ 74026:c802bfc8acfc
Issue #13621: Optimize str.replace(char1, char2)
Use findchar() which is more optimized than a dummy loop using
PyUnicode_READ(). PyUnicode_READ() is a complex and slow macro.
| author | Victor Stinner <victor.stinner@haypocalc.com> |
|---|---|
| date | Sun, 18 Dec 2011 02:43:08 +0100 |
| parents | 49b85dba251d |
| children | 20f2f5193b04 |
line wrap: on
line diff
--- a/Objects/unicodeobject.c Sun Dec 18 01:26:05 2011 +0100 +++ b/Objects/unicodeobject.c Sun Dec 18 02:43:08 2011 +0100 @@ -10285,7 +10285,6 @@ maxchar = Py_MAX(maxchar, maxchar_str2); if (len1 == len2) { - Py_ssize_t i; /* same length */ if (len1 == 0) goto nothing; @@ -10293,9 +10292,12 @@ /* replace characters */ Py_UCS4 u1, u2; int rkind; + Py_ssize_t index, pos; + char *src; + u1 = PyUnicode_READ_CHAR(str1, 0); - if (findchar(sbuf, PyUnicode_KIND(self), - slen, u1, 1) < 0) + pos = findchar(sbuf, PyUnicode_KIND(self), slen, u1, 1); + if (pos < 0) goto nothing; u2 = PyUnicode_READ_CHAR(str2, 0); u = PyUnicode_New(slen, maxchar); @@ -10303,16 +10305,26 @@ goto error; copy_characters(u, 0, self, 0, slen); rkind = PyUnicode_KIND(u); - for (i = 0; i < PyUnicode_GET_LENGTH(u); i++) - if (PyUnicode_READ(rkind, PyUnicode_DATA(u), i) == u1) { - if (--maxcount < 0) - break; - PyUnicode_WRITE(rkind, PyUnicode_DATA(u), i, u2); - } + + PyUnicode_WRITE(rkind, PyUnicode_DATA(u), pos, u2); + index = 0; + src = sbuf; + while (--maxcount) + { + pos++; + src += pos * PyUnicode_KIND(self); + slen -= pos; + index += pos; + pos = findchar(src, PyUnicode_KIND(self), slen, u1, 1); + if (pos < 0) + break; + PyUnicode_WRITE(rkind, PyUnicode_DATA(u), index + pos, u2); + } } else { int rkind = skind; char *res; + Py_ssize_t i; if (kind1 < rkind) { /* widen substring */
