Skip to content

Commit 58f3fe0

Browse files
authored
gh-129005: Remove copies from _pyio using take_bytes (#141539)
Memory usage now matches that of _io for large files.
1 parent 4867f71 commit 58f3fe0

File tree

3 files changed

+8
-9
lines changed

3 files changed

+8
-9
lines changed

Lib/_pyio.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ def nreadahead():
546546
res += b
547547
if res.endswith(b"\n"):
548548
break
549-
return bytes(res)
549+
return res.take_bytes()
550550

551551
def __iter__(self):
552552
self._checkClosed()
@@ -620,15 +620,15 @@ def read(self, size=-1):
620620
if n < 0 or n > len(b):
621621
raise ValueError(f"readinto returned {n} outside buffer size {len(b)}")
622622
del b[n:]
623-
return bytes(b)
623+
return b.take_bytes()
624624

625625
def readall(self):
626626
"""Read until EOF, using multiple read() call."""
627627
res = bytearray()
628628
while data := self.read(DEFAULT_BUFFER_SIZE):
629629
res += data
630630
if res:
631-
return bytes(res)
631+
return res.take_bytes()
632632
else:
633633
# b'' or None
634634
return data
@@ -1738,7 +1738,7 @@ def readall(self):
17381738
assert len(result) - bytes_read >= 1, \
17391739
"os.readinto buffer size 0 will result in erroneous EOF / returns 0"
17401740
result.resize(bytes_read)
1741-
return bytes(result)
1741+
return result.take_bytes()
17421742

17431743
def readinto(self, buffer):
17441744
"""Same as RawIOBase.readinto()."""

Lib/test/test_io/test_bufferedio.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1277,7 +1277,8 @@ def test_flush_and_readinto(self):
12771277
def _readinto(bufio, n=-1):
12781278
b = bytearray(n if n >= 0 else 9999)
12791279
n = bufio.readinto(b)
1280-
return bytes(b[:n])
1280+
b.resize(n)
1281+
return b.take_bytes()
12811282
self.check_flush_and_read(_readinto)
12821283

12831284
def test_flush_and_peek(self):

Lib/test/test_io/test_largefile.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ class TestFileMethods(LargeFileTest):
5656
(i.e. > 2 GiB) files.
5757
"""
5858

59-
# _pyio.FileIO.readall() uses a temporary bytearray then casted to bytes,
60-
# so memuse=2 is needed
61-
@bigmemtest(size=size, memuse=2, dry_run=False)
59+
@bigmemtest(size=size, memuse=1, dry_run=False)
6260
def test_large_read(self, _size):
6361
# bpo-24658: Test that a read greater than 2GB does not fail.
6462
with self.open(TESTFN, "rb") as f:
@@ -154,7 +152,7 @@ def test_seekable(self):
154152
f.seek(pos)
155153
self.assertTrue(f.seekable())
156154

157-
@bigmemtest(size=size, memuse=2, dry_run=False)
155+
@bigmemtest(size=size, memuse=1, dry_run=False)
158156
def test_seek_readall(self, _size):
159157
# Seek which doesn't change position should readall successfully.
160158
with self.open(TESTFN, 'rb') as f:

0 commit comments

Comments
 (0)