Accellerate binary readline() a bit.

This commit is contained in:
Guido van Rossum 2007-06-07 23:45:37 +00:00
parent 1325790b93
commit 48fc58ad31
2 changed files with 26 additions and 8 deletions

View File

@ -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

View File

@ -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)