[pypy-commit] pypy streamio-bufout: Sped up BufferingOutputStream and LineBufferingOutputStream

justinpeel noreply at buildbot.pypy.org
Thu Jul 21 00:02:06 CEST 2011


Author: Justin Peel <notmuchtotell at gmail.com>
Branch: streamio-bufout
Changeset: r45785:5d4b20b417a5
Date: 2011-07-19 17:19 -0600
http://bitbucket.org/pypy/pypy/changeset/5d4b20b417a5/

Log:	Sped up BufferingOutputStream and LineBufferingOutputStream

diff --git a/pypy/rlib/streamio.py b/pypy/rlib/streamio.py
--- a/pypy/rlib/streamio.py
+++ b/pypy/rlib/streamio.py
@@ -875,27 +875,30 @@
         if bufsize == -1:     # Get default from the class
             bufsize = self.bufsize
         self.bufsize = bufsize  # buffer size (hint only)
-        self.buf = ""
+        self.buf = []
+        self.buflen = 0
 
     def flush_buffers(self):
         if self.buf:
-            self.do_write(self.buf)
-            self.buf = ""
+            self.do_write(''.join(self.buf))
+            self.buf = []
 
     def tell(self):
         return self.do_tell() + len(self.buf)
 
     def write(self, data):
-        buflen = len(self.buf)
+        buflen = self.buflen
         datalen = len(data)
         if datalen + buflen < self.bufsize:
-            self.buf += data
+            self.buf.append(data)
+            self.buflen += datalen
         elif buflen:
             slice = self.bufsize - buflen
             assert slice >= 0
-            self.buf += data[:slice]
-            self.do_write(self.buf)
-            self.buf = ""
+            self.buf.append(data[:slice])
+            self.do_write(''.join(self.buf))
+            self.buf = []
+            self.buflen = 0
             self.write(data[slice:])
         else:
             self.do_write(data)
@@ -922,11 +925,29 @@
     """
 
     def write(self, data):
-        BufferingOutputStream.write(self, data)
-        p = self.buf.rfind('\n') + 1
+        p = data.rfind('\n') + 1
+        L = len(data)
         if p >= 0:
-            self.do_write(self.buf[:p])
-            self.buf = self.buf[p:]
+            if self.buf:
+                self.do_write(''.join(self.buf))
+                self.buf = []
+                self.buflen = 0
+            if L - p > self.bufsize:
+                self.do_write(data)
+            else:
+                self.do_write(data[:p])
+                if p != L:
+                    self.buf.append(data[p:])
+                    self.buflen = L - p
+        else:
+            if L + self.buflen > self.bufsize:
+                self.do_write(''.join(self.buf))
+                self.do_write(data)
+                self.buf = []
+                self.buflen = 0
+            else:
+                self.buf.append(data)
+                self.buflen += L
 
 
 # ____________________________________________________________


More information about the pypy-commit mailing list