[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