Skip to content

Commit

Permalink
bpo-47005: Improve performance of bytearray_repeat and bytearray_irep…
Browse files Browse the repository at this point in the history
…eat (GH-31856)
  • Loading branch information
eendebakpt committed Mar 17, 2022
1 parent 903f0a0 commit ac8308d
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 6 deletions.
@@ -0,0 +1 @@
Improve performance of ``bytearray_repeat`` and ``bytearray_irepeat`` by reducing the number of invocations of ``memcpy``.
28 changes: 22 additions & 6 deletions Objects/bytearrayobject.c
Expand Up @@ -335,9 +335,19 @@ bytearray_repeat(PyByteArrayObject *self, Py_ssize_t count)
if (mysize == 1)
memset(result->ob_bytes, buf[0], size);
else {
Py_ssize_t i;
for (i = 0; i < count; i++)
memcpy(result->ob_bytes + i*mysize, buf, mysize);
Py_ssize_t i, j;

i = 0;
if (i < size) {
memcpy(result->ob_bytes, buf, mysize);
i = mysize;
}
// repeatedly double the number of bytes copied
while (i < size) {
j = Py_MIN(i, size - i);
memcpy(result->ob_bytes + i, result->ob_bytes, j);
i += j;
}
}
}
return (PyObject *)result;
Expand All @@ -363,9 +373,15 @@ bytearray_irepeat(PyByteArrayObject *self, Py_ssize_t count)
if (mysize == 1)
memset(buf, buf[0], size);
else {
Py_ssize_t i;
for (i = 1; i < count; i++)
memcpy(buf + i*mysize, buf, mysize);
Py_ssize_t i, j;

i = mysize;
// repeatedly double the number of bytes copied
while (i < size) {
j = Py_MIN(i, size - i);
memcpy(buf + i, buf, j);
i += j;
}
}

Py_INCREF(self);
Expand Down

0 comments on commit ac8308d

Please sign in to comment.