mirror of
https://github.com/python/cpython.git
synced 2025-11-02 11:08:57 +00:00
Accellerate binary readline() a bit.
This commit is contained in:
parent
1325790b93
commit
48fc58ad31
2 changed files with 26 additions and 8 deletions
22
Lib/io.py
22
Lib/io.py
|
|
@ -298,17 +298,23 @@ class IOBase:
|
||||||
|
|
||||||
### Readline ###
|
### Readline ###
|
||||||
|
|
||||||
def readline(self, sizehint: int = -1) -> bytes:
|
def readline(self, limit: int = -1) -> bytes:
|
||||||
"""For backwards compatibility, a (slow) readline()."""
|
"""For backwards compatibility, a (slowish) readline()."""
|
||||||
if sizehint is None:
|
if limit is None:
|
||||||
sizehint = -1
|
limit = -1
|
||||||
res = b""
|
res = bytes()
|
||||||
while sizehint < 0 or len(res) < sizehint:
|
while limit < 0 or len(res) < limit:
|
||||||
b = self.read(1)
|
readahead = self.peek(1, unsafe=True)
|
||||||
|
if not readahead:
|
||||||
|
break
|
||||||
|
n = (readahead.find(b"\n") + 1) or len(readahead)
|
||||||
|
if limit >= 0:
|
||||||
|
n = min(n, limit)
|
||||||
|
b = self.read(n)
|
||||||
if not b:
|
if not b:
|
||||||
break
|
break
|
||||||
res += b
|
res += b
|
||||||
if b == b"\n":
|
if res.endswith(b"\n"):
|
||||||
break
|
break
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,18 @@ class IOTest(unittest.TestCase):
|
||||||
self.read_ops(f, True)
|
self.read_ops(f, True)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
def test_readline(self):
|
||||||
|
f = io.open(test_support.TESTFN, "wb")
|
||||||
|
f.write(b"abc\ndef\nxyzzy\nfoo")
|
||||||
|
f.close()
|
||||||
|
f = io.open(test_support.TESTFN, "rb")
|
||||||
|
self.assertEqual(f.readline(), b"abc\n")
|
||||||
|
self.assertEqual(f.readline(10), b"def\n")
|
||||||
|
self.assertEqual(f.readline(2), b"xy")
|
||||||
|
self.assertEqual(f.readline(4), b"zzy\n")
|
||||||
|
self.assertEqual(f.readline(), b"foo")
|
||||||
|
f.close()
|
||||||
|
|
||||||
def test_raw_bytes_io(self):
|
def test_raw_bytes_io(self):
|
||||||
f = io.BytesIO()
|
f = io.BytesIO()
|
||||||
self.write_ops(f)
|
self.write_ops(f)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue