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.
This commit is contained in:
parent
51b846c47a
commit
fac395681f
|
@ -339,6 +339,9 @@ Optimizations
|
|||
* Optimize :meth:`bytes.fromhex` and :meth:`bytearray.fromhex`: they are now
|
||||
between 2x and 3.5x faster. (Contributed by Victor Stinner in :issue:`25401`).
|
||||
|
||||
* Optimize ``bytes.replace(b'', b'.')`` and ``bytearray.replace(b'', b'.')``:
|
||||
up to 80% faster. (Contributed by Josh Snider in :issue:`26574`).
|
||||
|
||||
|
||||
Build and C API Changes
|
||||
=======================
|
||||
|
|
|
@ -1376,6 +1376,7 @@ Mark Smith
|
|||
Roy Smith
|
||||
Ryan Smith-Roberts
|
||||
Rafal Smotrzyk
|
||||
Josh Snider
|
||||
Eric Snow
|
||||
Dirk Soede
|
||||
Nir Soffer
|
||||
|
|
|
@ -10,6 +10,9 @@ Release date: tba
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #26574: Optimize ``bytes.replace(b'', b'.')`` and
|
||||
``bytearray.replace(b'', b'.')``. Patch written by Josh Snider.
|
||||
|
||||
- Issue #26581: If coding cookie is specified multiple times on a line in
|
||||
Python source code file, only the first one is taken to account.
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue