]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
In _fileobject, optimize read() a bit (it could be really slow), and
authorGuido van Rossum <guido@python.org>
Wed, 2 Feb 2000 16:57:32 +0000 (16:57 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 2 Feb 2000 16:57:32 +0000 (16:57 +0000)
remove "import string" -- use string methods instead!

Lib/plat-win/socket.py

index d5024f995233d6c2c1bfa28269f34917b8677fb9..0410aa7966173884fee19f3588374978c66ba0e3 100755 (executable)
@@ -96,31 +96,47 @@ class _fileobject:
 
        def read(self, n=-1):
                if n >= 0:
-                       while len(self._rbuf) < n:
-                               new = self._sock.recv(self._rbufsize)
+                       k = len(self._rbuf)
+                       if n <= k:
+                               data = self._rbuf[:n]
+                               self._rbuf = self._rbuf[n:]
+                               return data
+                       n = n - k
+                       l = [self._rbuf]
+                       self._rbuf = ""
+                       while n > 0:
+                               new = self._sock.recv(max(n, self._rbufsize))
                                if not new: break
-                               self._rbuf = self._rbuf + new
-                       data, self._rbuf = self._rbuf[:n], self._rbuf[n:]
-                       return data
+                               k = len(new)
+                               if k > n:
+                                       l.append(new[:n])
+                                       self._rbuf = new[n:]
+                                       break
+                               l.append(new)
+                               n = n - k
+                       return "".join(l)
+               k = max(512, self._rbufsize)
+               l = [self._rbuf]
+               self._rbuf = ""
                while 1:
-                       new = self._sock.recv(self._rbufsize)
+                       new = self._sock.recv(k)
                        if not new: break
-                       self._rbuf = self._rbuf + new
-               data, self._rbuf = self._rbuf, ""
-               return data
+                       l.append(new)
+                       k = min(k*2, 1024**2)
+               return "".join(l)
 
-       def readline(self):
-               import string
+       def readline(self, limit=-1):
                data = ""
-               i = string.find(self._rbuf, '\n')
-               while i < 0:
+               i = self._rbuf.find('\n')
+               while i < 0 and not (0 < limit <= len(self._rbuf)):
                        new = self._sock.recv(self._rbufsize)
                        if not new: break
-                       i = string.find(new, '\n')
+                       i = new.find('\n')
                        if i >= 0: i = i + len(self._rbuf)
                        self._rbuf = self._rbuf + new
                if i < 0: i = len(self._rbuf)
                else: i = i+1
+               if 0 <= limit < len(self._rbuf): i = limit
                data, self._rbuf = self._rbuf[:i], self._rbuf[i:]
                return data