summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2016-03-21 09:38:58 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2016-03-21 09:38:58 (GMT)
commitfac395681fb758401d17974f258b17d285336c57 (patch)
treea8cc198b2211687af8a7f14222b9e06d620cd3d6 /Objects
parent51b846c47a9b1db927939ccfb037a5a0ff6ff99c (diff)
downloadcpython-fac395681fb758401d17974f258b17d285336c57.zip
cpython-fac395681fb758401d17974f258b17d285336c57.tar.gz
cpython-fac395681fb758401d17974f258b17d285336c57.tar.bz2
Optimize bytes.replace(b'', b'.')
Issue #26574: Optimize bytes.replace(b'', b'.') and bytearray.replace(b'', b'.'): up to 80% faster. Patch written by Josh Snider.
Diffstat (limited to 'Objects')
-rw-r--r--Objects/bytearrayobject.c28
-rw-r--r--Objects/bytesobject.c28
2 files changed, 38 insertions, 18 deletions
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index 9e8ba39..209a641 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -1705,17 +1705,27 @@ replace_interleave(PyByteArrayObject *self,
self_s = PyByteArray_AS_STRING(self);
result_s = PyByteArray_AS_STRING(result);
- /* TODO: special case single character, which doesn't need memcpy */
-
- /* Lay the first one down (guaranteed this will occur) */
- Py_MEMCPY(result_s, to_s, to_len);
- result_s += to_len;
- count -= 1;
-
- for (i=0; i<count; i++) {
- *result_s++ = *self_s++;
+ if (to_len > 1) {
+ /* Lay the first one down (guaranteed this will occur) */
Py_MEMCPY(result_s, to_s, to_len);
result_s += to_len;
+ count -= 1;
+
+ for (i = 0; i < count; i++) {
+ *result_s++ = *self_s++;
+ Py_MEMCPY(result_s, to_s, to_len);
+ result_s += to_len;
+ }
+ }
+ else {
+ result_s[0] = to_s[0];
+ result_s += to_len;
+ count -= 1;
+ for (i = 0; i < count; i++) {
+ *result_s++ = *self_s++;
+ result_s[0] = to_s[0];
+ result_s += to_len;
+ }
}
/* Copy the rest of the original string */
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 602dea6..5b9006e 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -2464,17 +2464,27 @@ replace_interleave(PyBytesObject *self,
self_s = PyBytes_AS_STRING(self);
result_s = PyBytes_AS_STRING(result);
- /* TODO: special case single character, which doesn't need memcpy */
-
- /* Lay the first one down (guaranteed this will occur) */
- Py_MEMCPY(result_s, to_s, to_len);
- result_s += to_len;
- count -= 1;
-
- for (i=0; i<count; i++) {
- *result_s++ = *self_s++;
+ if (to_len > 1) {
+ /* Lay the first one down (guaranteed this will occur) */
Py_MEMCPY(result_s, to_s, to_len);
result_s += to_len;
+ count -= 1;
+
+ for (i = 0; i < count; i++) {
+ *result_s++ = *self_s++;
+ Py_MEMCPY(result_s, to_s, to_len);
+ result_s += to_len;
+ }
+ }
+ else {
+ result_s[0] = to_s[0];
+ result_s += to_len;
+ count -= 1;
+ for (i = 0; i < count; i++) {
+ *result_s++ = *self_s++;
+ result_s[0] = to_s[0];
+ result_s += to_len;
+ }
}
/* Copy the rest of the original string */