Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d390102

Browse files
committed
Sjoerd's StringIO speed-up
1 parent d4cc04c commit d390102

1 file changed

Lines changed: 30 additions & 7 deletions

File tree

Lib/StringIO.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
class StringIO:
3232
def __init__(self, buf = ''):
3333
self.buf = buf
34+
self.len = len(buf)
35+
self.buflist = []
3436
self.pos = 0
3537
self.closed = 0
3638
self.softspace = 0
@@ -41,25 +43,34 @@ def close(self):
4143
def isatty(self):
4244
return 0
4345
def seek(self, pos, mode = 0):
46+
if self.buflist:
47+
self.buf = self.buf + string.joinfields(self.buflist, '')
48+
self.buflist = []
4449
if mode == 1:
4550
pos = pos + self.pos
4651
elif mode == 2:
47-
pos = pos + len(self.buf)
52+
pos = pos + self.len
4853
self.pos = max(0, pos)
4954
def tell(self):
5055
return self.pos
5156
def read(self, n = -1):
57+
if self.buflist:
58+
self.buf = self.buf + string.joinfields(self.buflist, '')
59+
self.buflist = []
5260
if n < 0:
53-
newpos = len(self.buf)
61+
newpos = self.len
5462
else:
55-
newpos = min(self.pos+n, len(self.buf))
63+
newpos = min(self.pos+n, self.len)
5664
r = self.buf[self.pos:newpos]
5765
self.pos = newpos
5866
return r
5967
def readline(self):
68+
if self.buflist:
69+
self.buf = self.buf + string.joinfields(self.buflist, '')
70+
self.buflist = []
6071
i = string.find(self.buf, '\n', self.pos)
6172
if i < 0:
62-
newpos = len(self.buf)
73+
newpos = self.len
6374
else:
6475
newpos = i+1
6576
r = self.buf[self.pos:newpos]
@@ -74,16 +85,28 @@ def readlines(self):
7485
return lines
7586
def write(self, s):
7687
if not s: return
77-
if self.pos > len(self.buf):
78-
self.buf = self.buf + '\0'*(self.pos - len(self.buf))
88+
if self.pos > self.len:
89+
self.buflist.append('\0'*(self.pos - self.len))
90+
self.len = self.pos
7991
newpos = self.pos + len(s)
80-
self.buf = self.buf[:self.pos] + s + self.buf[newpos:]
92+
if self.pos < self.len:
93+
if self.buflist:
94+
self.buf = self.buf + string.joinfields(self.buflist, '')
95+
self.buflist = []
96+
self.buflist = [self.buf[:self.pos], s, self.buf[newpos:]]
97+
self.buf = ''
98+
else:
99+
self.buflist.append(s)
100+
self.len = newpos
81101
self.pos = newpos
82102
def writelines(self, list):
83103
self.write(string.joinfields(list, ''))
84104
def flush(self):
85105
pass
86106
def getvalue(self):
107+
if self.buflist:
108+
self.buf = self.buf + string.joinfields(self.buflist, '')
109+
self.buflist = []
87110
return self.buf
88111

89112

0 commit comments

Comments
 (0)