Author: Timo Paulssen <timona...@perpetuum-immobile.de> Branch: numpy-data-buffer Changeset: r47795:fa778e5f7b0f Date: 2011-10-03 16:48 +0200 http://bitbucket.org/pypy/pypy/changeset/fa778e5f7b0f/
Log: use StringBuilder for getslice in NumpyBuffer. diff --git a/pypy/module/_numpy/interp_buffer.py b/pypy/module/_numpy/interp_buffer.py --- a/pypy/module/_numpy/interp_buffer.py +++ b/pypy/module/_numpy/interp_buffer.py @@ -1,5 +1,6 @@ from pypy.interpreter.buffer import RWBuffer from pypy.rpython.lltypesystem import lltype, rffi +from pypy.rlib.rstring import StringBuilder CHAR_TP = lltype.Ptr(lltype.Array(lltype.Char, hints={'nolength': True})) @@ -10,27 +11,41 @@ def getlength(self): return self.array.get_concrete().find_size() * self.array.find_dtype().num_bytes - def getitem(self, index): - if index > self.getlength(): - raise IndexError("Index out of bounds (0<=index<=%d)" % self.getlength()) + def getitem_noboundcheck(self, index): storage = self.array.get_concrete().get_root_storage() char_data = rffi.cast(CHAR_TP, storage) index = self.calc_index(index) return char_data[index] - def setitem(self, index, value): + def getitem(self, index): if index > self.getlength(): raise IndexError("Index out of bounds (0<=index<=%d)" % self.getlength()) + return self.getitem_noboundcheck(index) + + def setitem_noboundcheck(self, index, value): storage = self.array.get_concrete().get_root_storage() char_ptr = rffi.cast(CHAR_TP, storage) index = self.calc_index(index) char_ptr[index] = value + def setitem(self, index, value): + if index > self.getlength(): + raise IndexError("Index out of bounds (0<=index<=%d)" % self.getlength()) + self.setitem_noboundcheck(index, value) + def setslice(self, index, newstring): if index + len(newstring) > self.getlength(): raise IndexError("End of slice to set out of bounds (0<=index<=%d)" % self.getlength()) for idx in range(0, len(newstring)): - self.setitem(index + idx, newstring[idx]) + self.setitem_noboundcheck(index + idx, newstring[idx]) + + def getslice(self, start, stop, step, size): + builder = StringBuilder(size) + + for index in range(start, stop, step): + builder.append(self.getitem_noboundcheck(index)) + + return builder.build() def calc_index(self, index): return index _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit