Accellerate binary readline() a bit.
diff --git a/Lib/io.py b/Lib/io.py
index f1be881..4d46b47 100644
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -298,17 +298,23 @@
 
     ### 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 c98d61f..c555623 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -168,6 +168,18 @@
         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)