From: Guido van Rossum Date: Thu, 7 Jun 2007 23:45:37 +0000 (+0000) Subject: Accellerate binary readline() a bit. X-Git-Tag: v3.0a1~809 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=48fc58ad31408e0f452d046a23c59b7556f6a9b0;p=python Accellerate binary readline() a bit. --- diff --git a/Lib/io.py b/Lib/io.py index f1be881946..4d46b477a5 100644 --- a/Lib/io.py +++ b/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 diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index c98d61fbd4..c5556231e8 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -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)