Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r48046:cc2c0908716e
Date: 2011-10-14 01:04 -0400
http://bitbucket.org/pypy/pypy/changeset/cc2c0908716e/
Log: make a bunch of random str and unicode methods faster
diff --git a/pypy/objspace/std/stringobject.py
b/pypy/objspace/std/stringobject.py
--- a/pypy/objspace/std/stringobject.py
+++ b/pypy/objspace/std/stringobject.py
@@ -161,19 +161,19 @@
def str_swapcase__String(space, w_self):
self = w_self._value
- res = [' '] * len(self)
+ builder = StringBuilder(len(self))
for i in range(len(self)):
ch = self[i]
if ch.isupper():
o = ord(ch) + 32
- res[i] = chr(o)
+ builder.append(chr(o))
elif ch.islower():
o = ord(ch) - 32
- res[i] = chr(o)
+ builder.append(chr(o))
else:
- res[i] = ch
+ builder.append(ch)
- return space.wrap("".join(res))
+ return space.wrap(builder.build())
def str_capitalize__String(space, w_self):
@@ -199,19 +199,21 @@
def str_title__String(space, w_self):
input = w_self._value
- buffer = [' '] * len(input)
+ builder = StringBuilder(len(input))
prev_letter=' '
- for pos in range(0, len(input)):
+ for pos in range(len(input)):
ch = input[pos]
if not prev_letter.isalpha():
- buffer[pos] = _upper(ch)
+ ch = _upper(ch)
+ builder.append(ch)
else:
- buffer[pos] = _lower(ch)
+ ch = _lower(ch)
+ builder.append(ch)
- prev_letter = buffer[pos]
+ prev_letter = ch
- return space.wrap("".join(buffer))
+ return space.wrap(builder.build())
def str_split__String_None_ANY(space, w_self, w_none, w_maxsplit=-1):
maxsplit = space.int_w(w_maxsplit)
@@ -758,23 +760,18 @@
# cannot return w_self, in case it is a subclass of str
return space.wrap(input)
- buf = [' '] * width
+ builder = StringBuilder(width)
if len(input) > 0 and (input[0] == '+' or input[0] == '-'):
- buf[0] = input[0]
+ builder.append(input[0])
start = 1
middle = width - len(input) + 1
else:
start = 0
middle = width - len(input)
- for i in range(start, middle):
- buf[i] = '0'
-
- for i in range(middle, width):
- buf[i] = input[start]
- start = start + 1
-
- return space.wrap("".join(buf))
+ builder.append_multiple_char('0', middle - start)
+ builder.append(input[start:start + (width - middle)])
+ return space.wrap(builder.build())
def hash__String(space, w_str):
diff --git a/pypy/objspace/std/unicodeobject.py
b/pypy/objspace/std/unicodeobject.py
--- a/pypy/objspace/std/unicodeobject.py
+++ b/pypy/objspace/std/unicodeobject.py
@@ -417,54 +417,54 @@
input = w_self._value
if len(input) == 0:
return W_UnicodeObject.EMPTY
- result = [u'\0'] * len(input)
- result[0] = unichr(unicodedb.toupper(ord(input[0])))
+ builder = UnicodeBuilder(len(input))
+ builder.append(unichr(unicodedb.toupper(ord(input[0]))))
for i in range(1, len(input)):
- result[i] = unichr(unicodedb.tolower(ord(input[i])))
- return W_UnicodeObject(u''.join(result))
+ builder.append(unichr(unicodedb.tolower(ord(input[i]))))
+ return W_UnicodeObject(builder.build())
def unicode_title__Unicode(space, w_self):
input = w_self._value
if len(input) == 0:
return w_self
- result = [u'\0'] * len(input)
+ builder = UnicodeBuilder(len(input))
previous_is_cased = False
for i in range(len(input)):
unichar = ord(input[i])
if previous_is_cased:
- result[i] = unichr(unicodedb.tolower(unichar))
+ builder.append(unichr(unicodedb.tolower(unichar)))
else:
- result[i] = unichr(unicodedb.totitle(unichar))
+ builder.append(unichr(unicodedb.totitle(unichar)))
previous_is_cased = unicodedb.iscased(unichar)
- return W_UnicodeObject(u''.join(result))
+ return W_UnicodeObject(builder.build())
def unicode_lower__Unicode(space, w_self):
input = w_self._value
- result = [u'\0'] * len(input)
+ builder = UnicodeBuilder(len(input))
for i in range(len(input)):
- result[i] = unichr(unicodedb.tolower(ord(input[i])))
- return W_UnicodeObject(u''.join(result))
+ builder.append(unichr(unicodedb.tolower(ord(input[i]))))
+ return W_UnicodeObject(builder.build())
def unicode_upper__Unicode(space, w_self):
input = w_self._value
- result = [u'\0'] * len(input)
+ builder = UnicodeBuilder(len(input))
for i in range(len(input)):
- result[i] = unichr(unicodedb.toupper(ord(input[i])))
- return W_UnicodeObject(u''.join(result))
+ builder.append(unichr(unicodedb.toupper(ord(input[i]))))
+ return W_UnicodeObject(builder.build())
def unicode_swapcase__Unicode(space, w_self):
input = w_self._value
- result = [u'\0'] * len(input)
+ builder = UnicodeBuilder(len(input))
for i in range(len(input)):
unichar = ord(input[i])
if unicodedb.islower(unichar):
- result[i] = unichr(unicodedb.toupper(unichar))
+ builder.append(unichr(unicodedb.toupper(unichar)))
elif unicodedb.isupper(unichar):
- result[i] = unichr(unicodedb.tolower(unichar))
+ builder.append(unichr(unicodedb.tolower(unichar)))
else:
- result[i] = input[i]
- return W_UnicodeObject(u''.join(result))
+ builder.append(input[i])
+ return W_UnicodeObject(builder.build())
def _normalize_index(length, index):
if index < 0:
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit