Author: Maciej Fijalkowski <[email protected]>
Branch:
Changeset: r58543:e5eb07255e76
Date: 2012-10-28 19:22 +0100
http://bitbucket.org/pypy/pypy/changeset/e5eb07255e76/
Log: some speedups
diff --git a/pypy/module/micronumpy/arrayimpl/concrete.py
b/pypy/module/micronumpy/arrayimpl/concrete.py
--- a/pypy/module/micronumpy/arrayimpl/concrete.py
+++ b/pypy/module/micronumpy/arrayimpl/concrete.py
@@ -381,6 +381,8 @@
class ConcreteArray(BaseConcreteArray):
def __init__(self, shape, dtype, order, strides, backstrides):
make_sure_not_resized(shape)
+ make_sure_not_resized(strides)
+ make_sure_not_resized(backstrides)
self.shape = shape
self.size = support.product(shape) * dtype.get_size()
self.storage = dtype.itemtype.malloc(self.size)
@@ -389,8 +391,8 @@
self.strides = strides
self.backstrides = backstrides
- def create_iter(self, shape):
- if shape == self.get_shape():
+ def create_iter(self, shape=None):
+ if shape is None or shape == self.get_shape():
return ConcreteArrayIterator(self)
r = calculate_broadcast_strides(self.strides, self.backstrides,
self.get_shape(), shape)
@@ -426,8 +428,8 @@
def fill(self, box):
loop.fill(self, box.convert_to(self.dtype))
- def create_iter(self, shape):
- if shape != self.get_shape():
+ def create_iter(self, shape=None):
+ if shape is not None and shape != self.get_shape():
r = calculate_broadcast_strides(self.strides, self.backstrides,
self.get_shape(), shape)
return MultiDimViewIterator(self.parent,
diff --git a/pypy/module/micronumpy/arrayimpl/scalar.py
b/pypy/module/micronumpy/arrayimpl/scalar.py
--- a/pypy/module/micronumpy/arrayimpl/scalar.py
+++ b/pypy/module/micronumpy/arrayimpl/scalar.py
@@ -34,7 +34,7 @@
def get_shape(self):
return []
- def create_iter(self, shape):
+ def create_iter(self, shape=None):
return ScalarIterator(self.value)
def get_scalar_value(self):
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
@@ -190,7 +190,7 @@
return space.call_function(cache.w_array_str, self)
def dump_data(self):
- i = self.create_iter(self.get_shape())
+ i = self.create_iter()
first = True
dtype = self.get_dtype()
s = StringBuilder()
@@ -206,8 +206,6 @@
return s.build()
def create_iter(self, shape=None):
- if shape is None:
- shape = self.get_shape()
return self.implementation.create_iter(shape)
def create_axis_iter(self, shape, dim):
@@ -396,7 +394,7 @@
if self.get_size() > 1:
raise OperationError(space.w_ValueError, space.wrap(
"The truth value of an array with more than one element is
ambiguous. Use a.any() or a.all()"))
- iter = self.create_iter(self.get_shape())
+ iter = self.create_iter()
return space.wrap(space.is_true(iter.getitem()))
def _binop_impl(ufunc_name):
@@ -681,7 +679,7 @@
if ndmin > len(shape):
shape = [1] * (ndmin - len(shape)) + shape
arr = W_NDimArray.from_shape(shape, dtype, order=order)
- arr_iter = arr.create_iter(arr.get_shape())
+ arr_iter = arr.create_iter()
for w_elem in elems_w:
arr_iter.setitem(dtype.coerce(space, w_elem))
arr_iter.next()
diff --git a/pypy/module/micronumpy/loop.py b/pypy/module/micronumpy/loop.py
--- a/pypy/module/micronumpy/loop.py
+++ b/pypy/module/micronumpy/loop.py
@@ -89,7 +89,7 @@
reds = ['obj', 'obj_iter', 'cur_value'])
def compute_reduce(obj, calc_dtype, func, done_func, identity):
- obj_iter = obj.create_iter(obj.get_shape())
+ obj_iter = obj.create_iter()
if identity is None:
cur_value = obj_iter.getitem().convert_to(calc_dtype)
obj_iter.next()
@@ -109,7 +109,7 @@
return cur_value
def fill(arr, box):
- arr_iter = arr.create_iter(arr.get_shape())
+ arr_iter = arr.create_iter()
while not arr_iter.done():
arr_iter.setitem(box)
arr_iter.next()
@@ -159,7 +159,7 @@
def do_axis_reduce(shape, func, arr, dtype, axis, out, identity):
out_iter = out.create_axis_iter(arr.get_shape(), axis)
- arr_iter = arr.create_iter(arr.get_shape())
+ arr_iter = arr.create_iter()
if identity is not None:
identity = identity.convert_to(dtype)
shapelen = len(shape)
@@ -192,7 +192,7 @@
result = 0
idx = 1
dtype = arr.get_dtype()
- iter = arr.create_iter(arr.get_shape())
+ iter = arr.create_iter()
cur_best = iter.getitem()
iter.next()
shapelen = len(arr.get_shape())
diff --git a/pypy/module/micronumpy/strides.py
b/pypy/module/micronumpy/strides.py
--- a/pypy/module/micronumpy/strides.py
+++ b/pypy/module/micronumpy/strides.py
@@ -15,16 +15,22 @@
jit.isconstant(len(chunks))
)
def calculate_slice_strides(shape, start, strides, backstrides, chunks):
- rstrides = []
- rbackstrides = []
+ size = 0
+ for chunk in chunks:
+ if chunk.step != 0:
+ size += 1
+ rstrides = [0] * size
+ rbackstrides = [0] * size
rstart = start
- rshape = []
+ rshape = [0] * size
i = -1
+ j = 0
for i, chunk in enumerate_chunks(chunks):
if chunk.step != 0:
- rstrides.append(strides[i] * chunk.step)
- rbackstrides.append(strides[i] * (chunk.lgt - 1) * chunk.step)
- rshape.append(chunk.lgt)
+ rstrides[j] = strides[i] * chunk.step
+ rbackstrides[j] = strides[i] * (chunk.lgt - 1) * chunk.step
+ rshape[j] = chunk.lgt
+ j += i
rstart += strides[i] * chunk.start
# add a reminder
s = i + 1
@@ -255,19 +261,19 @@
cur_step = steps[oldI]
n_old_elems_to_use *= old_shape[oldI]
assert len(new_strides) == len(new_shape)
- return new_strides
+ return new_strides[:]
def calculate_dot_strides(strides, backstrides, res_shape, skip_dims):
- rstrides = []
- rbackstrides = []
- j=0
+ rstrides = [0] * len(res_shape)
+ rbackstrides = [0] * len(res_shape)
+ j = 0
for i in range(len(res_shape)):
if i in skip_dims:
- rstrides.append(0)
- rbackstrides.append(0)
+ rstrides[i] = 0
+ rbackstrides[i] = 0
else:
- rstrides.append(strides[j])
- rbackstrides.append(backstrides[j])
+ rstrides[i] = strides[j]
+ rbackstrides[i] = backstrides[j]
j += 1
return rstrides, rbackstrides
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit