Accellerate binary readline() a bit.
This commit is contained in:
parent
1325790b93
commit
48fc58ad31
22
Lib/io.py
22
Lib/io.py
|
@ -298,17 +298,23 @@ class IOBase:
|
|||
|
||||
### Readline ###
|
||||
|
||||
def readline(self, sizehint: int = -1) -> bytes:
|
||||
"""For backwards compatibility, a (slow) readline()."""
|
||||
if sizehint is None:
|
||||
sizehint = -1
|
||||
res = b""
|
||||
while sizehint < 0 or len(res) < sizehint:
|
||||
b = self.read(1)
|
||||
def readline(self, limit: int = -1) -> bytes:
|
||||
"""For backwards compatibility, a (slowish) readline()."""
|
||||
if limit is None:
|
||||
limit = -1
|
||||
res = bytes()
|
||||
while limit < 0 or len(res) < limit:
|
||||
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:
|
||||
break
|
||||
res += b
|
||||
if b == b"\n":
|
||||
if res.endswith(b"\n"):
|
||||
break
|
||||
return res
|
||||
|
||||
|
|
|
@ -168,6 +168,18 @@ class IOTest(unittest.TestCase):
|
|||
self.read_ops(f, True)
|
||||
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):
|
||||
f = io.BytesIO()
|
||||
self.write_ops(f)
|
||||
|
|
Loading…
Reference in New Issue