From e1c4ba928852eac0b0e0bded1c314e3e36975286 Mon Sep 17 00:00:00 2001 From: Cody Maloney Date: Thu, 30 Jan 2025 03:23:25 -0800 Subject: gh-129005: _pyio.BufferedIO remove copy on readall (#129454) Slicing buf and appending chunk would always result in a copy. Commonly in a readall() there is no already read data in buf, and the amount of data read may be large, so the copy is expensive. --- Lib/_pyio.py | 3 +++ .../NEWS.d/next/Library/2025-01-29-00-00-01.gh-issue-129005.aV_3O8.rst | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2025-01-29-00-00-01.gh-issue-129005.aV_3O8.rst diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 76a2791..755e025 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1062,6 +1062,9 @@ class BufferedReader(_BufferedIOMixin): if chunk is None: return buf[pos:] or None else: + # Avoid slice + copy if there is no data in buf + if not buf: + return chunk return buf[pos:] + chunk chunks = [buf[pos:]] # Strip the consumed bytes. current_size = 0 diff --git a/Misc/NEWS.d/next/Library/2025-01-29-00-00-01.gh-issue-129005.aV_3O8.rst b/Misc/NEWS.d/next/Library/2025-01-29-00-00-01.gh-issue-129005.aV_3O8.rst new file mode 100644 index 0000000..48ee571 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-01-29-00-00-01.gh-issue-129005.aV_3O8.rst @@ -0,0 +1,2 @@ +:mod:`!_pyio`: Remove an unnecessary copy when ``_pyio.BufferedReader.read()`` +is called to read all data from a file and has no data already in buffer. -- cgit v0.12