From f669add510765bd6a80cb6446bd6065fa2b06254 Mon Sep 17 00:00:00 2001 From: maurycy <5383+maurycy@users.noreply.github.com> Date: Wed, 15 Oct 2025 00:42:52 +0200 Subject: [PATCH 1/5] use PyBytesWriter in _io__RawIOBase_readall_impl --- Modules/_io/iobase.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index aa373f6fdcb9d9..466aab33402d2a 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -962,11 +962,10 @@ static PyObject * _io__RawIOBase_readall_impl(PyObject *self) /*[clinic end generated code: output=1987b9ce929425a0 input=688874141213622a]*/ { - int r; - PyObject *chunks = PyList_New(0); + PyBytesWriter *writer = PyBytesWriter_Create(0); PyObject *result; - if (chunks == NULL) + if (writer == NULL) return NULL; while (1) { @@ -978,21 +977,21 @@ _io__RawIOBase_readall_impl(PyObject *self) if (_PyIO_trap_eintr()) { continue; } - Py_DECREF(chunks); + PyBytesWriter_Discard(writer); return NULL; } if (data == Py_None) { - if (PyList_GET_SIZE(chunks) == 0) { - Py_DECREF(chunks); + if (PyBytesWriter_GetSize(writer) == 0) { + PyBytesWriter_Discard(writer); return data; } Py_DECREF(data); break; } if (!PyBytes_Check(data)) { - Py_DECREF(chunks); Py_DECREF(data); PyErr_SetString(PyExc_TypeError, "read() should return bytes"); + PyBytesWriter_Discard(writer); return NULL; } if (PyBytes_GET_SIZE(data) == 0) { @@ -1000,16 +999,16 @@ _io__RawIOBase_readall_impl(PyObject *self) Py_DECREF(data); break; } - r = PyList_Append(chunks, data); - Py_DECREF(data); - if (r < 0) { - Py_DECREF(chunks); + if (PyBytesWriter_WriteBytes(writer, + PyBytes_AS_STRING(data), + PyBytes_GET_SIZE(data)) < 0) { + Py_DECREF(data); + PyBytesWriter_Discard(writer); return NULL; } + Py_DECREF(data); } - result = PyBytes_Join((PyObject *)&_Py_SINGLETON(bytes_empty), chunks); - Py_DECREF(chunks); - return result; + return PyBytesWriter_Finish(writer); } static PyObject * From eab974279a5e6171a38b43ad46d3b1c94ab3d117 Mon Sep 17 00:00:00 2001 From: maurycy <5383+maurycy@users.noreply.github.com> Date: Wed, 15 Oct 2025 01:46:55 +0200 Subject: [PATCH 2/5] unused var --- Modules/_io/iobase.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 466aab33402d2a..23cc6fdf0fda17 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -963,7 +963,6 @@ _io__RawIOBase_readall_impl(PyObject *self) /*[clinic end generated code: output=1987b9ce929425a0 input=688874141213622a]*/ { PyBytesWriter *writer = PyBytesWriter_Create(0); - PyObject *result; if (writer == NULL) return NULL; From b8a7f89a04f1dd8bfa43a29ff3b9ec2b8c190f33 Mon Sep 17 00:00:00 2001 From: maurycy <5383+maurycy@users.noreply.github.com> Date: Wed, 15 Oct 2025 02:11:40 +0200 Subject: [PATCH 3/5] be curly --- Modules/_io/iobase.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 23cc6fdf0fda17..b781ddd72064b4 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -964,8 +964,9 @@ _io__RawIOBase_readall_impl(PyObject *self) { PyBytesWriter *writer = PyBytesWriter_Create(0); - if (writer == NULL) + if (writer == NULL) { return NULL; + } while (1) { PyObject *data = _PyObject_CallMethod(self, &_Py_ID(read), From f0ae8248148105e0c54f53b28443438271977925 Mon Sep 17 00:00:00 2001 From: maurycy <5383+maurycy@users.noreply.github.com> Date: Wed, 15 Oct 2025 02:26:59 +0200 Subject: [PATCH 4/5] NEWS --- .../next/Library/2025-10-15-02-26-50.gh-issue-140135.54JYfM.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-10-15-02-26-50.gh-issue-140135.54JYfM.rst diff --git a/Misc/NEWS.d/next/Library/2025-10-15-02-26-50.gh-issue-140135.54JYfM.rst b/Misc/NEWS.d/next/Library/2025-10-15-02-26-50.gh-issue-140135.54JYfM.rst new file mode 100644 index 00000000000000..8d5a76af90906a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-15-02-26-50.gh-issue-140135.54JYfM.rst @@ -0,0 +1,2 @@ +Speed up :meth:`io.RawIOBase.readall` by using PyBytesWriter API (about 4x +faster) From 1b9d655d21bca369f5f9cbc60bffb52a72c46327 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 15 Oct 2025 15:36:48 +0200 Subject: [PATCH 5/5] Remove empty line --- Modules/_io/iobase.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index b781ddd72064b4..acadbcc4d59c38 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -963,7 +963,6 @@ _io__RawIOBase_readall_impl(PyObject *self) /*[clinic end generated code: output=1987b9ce929425a0 input=688874141213622a]*/ { PyBytesWriter *writer = PyBytesWriter_Create(0); - if (writer == NULL) { return NULL; }