Author: Maciej Fijalkowski <[email protected]>
Branch: numpy-faster-setslice
Changeset: r50809:2961d5daa1d1
Date: 2011-12-21 21:46 +0200
http://bitbucket.org/pypy/pypy/changeset/2961d5daa1d1/
Log: share code between copy and setslice
diff --git a/pypy/module/micronumpy/interp_numarray.py
b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -390,10 +390,10 @@
return space.wrap(self.size)
def descr_copy(self, space):
- return self.copy()
+ return self.copy(space)
- def copy(self):
- return self.get_concrete().copy()
+ def copy(self, space):
+ return self.get_concrete().copy(space)
def descr_len(self, space):
if len(self.shape):
@@ -536,7 +536,7 @@
new_shape, self)
else:
# Create copy with contiguous data
- arr = concrete.copy()
+ arr = concrete.copy(space)
arr.setshape(space, new_shape)
return arr
@@ -642,7 +642,7 @@
def to_str(self, space, comma, builder, indent=' ', use_ellipsis=False):
builder.append(self.dtype.itemtype.str_format(self.value))
- def copy(self):
+ def copy(self, space):
return Scalar(self.dtype, self.value)
def create_sig(self, res_shape):
@@ -935,36 +935,6 @@
item += v * self.strides[i]
return item
-
-class ViewArray(ConcreteArray):
- def copy(self):
- array = W_NDimArray(self.size, self.shape[:], self.find_dtype())
- iter = view_iter_from_arr(self)
- a_iter = ArrayIterator(array.size)
- while not iter.done():
- array.setitem(a_iter.offset, self.getitem(iter.offset))
- iter = iter.next(len(self.shape))
- a_iter = a_iter.next(len(array.shape))
- return array
-
- def create_sig(self, res_shape):
- return signature.ViewSignature(self.dtype)
-
-
-class W_NDimSlice(ViewArray):
- def __init__(self, start, strides, backstrides, shape, parent):
- assert isinstance(parent, ConcreteArray)
- if isinstance(parent, W_NDimSlice):
- parent = parent.parent
- size = 1
- for sh in shape:
- size *= sh
- self.strides = strides
- self.backstrides = backstrides
- ViewArray.__init__(self, size, shape, parent.dtype, parent.order,
- parent)
- self.start = start
-
def setslice(self, space, w_value):
res_shape = shape_agreement(space, self.shape, w_value.shape)
if (res_shape == w_value.shape and self.supports_fast_slicing() and
@@ -990,7 +960,7 @@
rffi.c_memcpy(
rffi.ptradd(self.storage, dest.offset * itemsize),
rffi.ptradd(w_value.storage, source.offset * itemsize),
- self.shape[0] * itemsize
+ self.shape[-1] * itemsize
)
source.next()
dest.next()
@@ -1011,6 +981,31 @@
frame.next(shapelen)
res_iter = res_iter.next(shapelen)
+ def copy(self, space):
+ array = W_NDimArray(self.size, self.shape[:], self.dtype, self.order)
+ array.setslice(space, self)
+ return array
+
+
+class ViewArray(ConcreteArray):
+ def create_sig(self, res_shape):
+ return signature.ViewSignature(self.dtype)
+
+
+class W_NDimSlice(ViewArray):
+ def __init__(self, start, strides, backstrides, shape, parent):
+ assert isinstance(parent, ConcreteArray)
+ if isinstance(parent, W_NDimSlice):
+ parent = parent.parent
+ size = 1
+ for sh in shape:
+ size *= sh
+ self.strides = strides
+ self.backstrides = backstrides
+ ViewArray.__init__(self, size, shape, parent.dtype, parent.order,
+ parent)
+ self.start = start
+
def setshape(self, space, new_shape):
if len(self.shape) < 1:
return
@@ -1049,15 +1044,6 @@
""" A class representing contiguous array. We know that each iteration
by say ufunc will increase the data index by one
"""
- def copy(self):
- array = W_NDimArray(self.size, self.shape[:], self.dtype, self.order)
- rffi.c_memcpy(
- array.storage,
- self.storage,
- self.size * self.dtype.itemtype.get_element_size()
- )
- return array
-
def setitem(self, item, value):
self.invalidated()
self.dtype.setitem(self.storage, item, value)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit