From c75bcab7932ab06ce8acd9e17b1a52289951225d Mon Sep 17 00:00:00 2001 From: Dmitrii Petrov Date: Fri, 7 Aug 2026 00:34:56 +0300 Subject: [PATCH] gh-150942: Speed up IOBase.readlines --- .../2026-08-07-00-40-00.gh-issue-150942.demitryfly.rst | 2 ++ Modules/_io/iobase.c | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2026-08-07-00-40-00.gh-issue-150942.demitryfly.rst diff --git a/Misc/NEWS.d/next/Library/2026-08-07-00-40-00.gh-issue-150942.demitryfly.rst b/Misc/NEWS.d/next/Library/2026-08-07-00-40-00.gh-issue-150942.demitryfly.rst new file mode 100644 index 00000000000000..6bb039840f16ca --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-08-07-00-40-00.gh-issue-150942.demitryfly.rst @@ -0,0 +1,2 @@ +Improve the performance of :meth:`io.IOBase.readlines` by avoiding +unnecessary reference-count operations while building the result list. diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 1253f124108bdb..46185a8a0de867 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -11,6 +11,7 @@ #include "Python.h" #include "pycore_call.h" // _PyObject_CallMethod() #include "pycore_fileutils.h" // _PyFile_Flush +#include "pycore_list.h" // _PyList_AppendTakeRef() #include "pycore_long.h" // _PyLong_GetOne() #include "pycore_object.h" // _PyType_HasFeature() #include "pycore_pyerrors.h" // _PyErr_ChainExceptions1() @@ -753,12 +754,10 @@ _io__IOBase_readlines_impl(PyObject *self, Py_ssize_t hint) break; /* StopIteration raised */ } - if (PyList_Append(result, line) < 0) { - Py_DECREF(line); + if (_PyList_AppendTakeRef((PyListObject *)result, line) < 0) { goto error; } line_length = PyObject_Size(line); - Py_DECREF(line); if (line_length < 0) { goto error; }