[pypy-commit] pypy numpy-singledim: numpy: improved implementation of size and ndim
justinpeel
noreply at buildbot.pypy.org
Fri Jul 15 21:41:32 CEST 2011
Author: Justin Peel <notmuchtotell at gmail.com>
Branch: numpy-singledim
Changeset: r45645:a60790b8cf0d
Date: 2011-07-14 23:14 -0600
http://bitbucket.org/pypy/pypy/changeset/a60790b8cf0d/
Log: numpy: improved implementation of size and ndim
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
@@ -247,10 +247,10 @@
return self.get_concrete().descr_len(space)
def descr_get_size(self, space):
- return self.get_concrete().descr_get_size(space)
+ return space.wrap(self.find_size())
def descr_get_ndim(self, space):
- return self.get_concrete().descr_get_ndim(space)
+ return space.wrap(self.find_ndim())
def descr_repr(self, space):
return self.get_concrete().descr_repr(space)
@@ -309,6 +309,9 @@
def find_size(self):
raise ValueError
+ def find_ndim(self):
+ raise ValueError
+
def eval(self, i):
return self.float_value
@@ -358,6 +361,12 @@
return self.forced_result.find_size()
return self._find_size()
+ def find_ndim(self):
+ if self.forced_result is not None:
+ # The result has been computed and sources may be unavailable
+ return self.forced_result.find_ndim()
+ return self._find_ndim()
+
class Call1(VirtualArray):
_immutable_fields_ = ["function", "values"]
@@ -373,6 +382,9 @@
def _find_size(self):
return self.values.find_size()
+ def _find_ndim(self):
+ return self.values.find_ndim()
+
def _eval(self, i):
return self.function(self.values.eval(i))
@@ -399,6 +411,13 @@
pass
return self.right.find_size()
+ def _find_ndim(self):
+ try:
+ return self.left.find_ndim()
+ except ValueError:
+ pass
+ return self.right.find_ndim()
+
def _eval(self, i):
lhs, rhs = self.left.eval(i), self.right.eval(i)
return self.function(lhs, rhs)
@@ -434,6 +453,8 @@
return self.parent.descr_setitem(space, self.calc_index(item), value)
def descr_len(self, space):
+ # This will need to change for multidimensional arrays.
+ # For them, len returns the size of the first dimension
return space.wrap(self.find_size())
def calc_index(self, item):
@@ -449,10 +470,14 @@
self.stop = stop
self.step = step
self.size = slice_length
+ self.ndim = 1
def find_size(self):
return self.size
+ def find_ndim(self):
+ return self.ndim
+
def calc_index(self, item):
return (self.start + item * self.step)
@@ -463,16 +488,22 @@
def __init__(self, size):
BaseArray.__init__(self)
self.size = size
+ self.ndim = 1
self.storage = lltype.malloc(TP, size, zero=True,
flavor='raw', track_allocation=False)
# XXX find out why test_zjit explodes with trackign of allocations
-
+ # we could probably put get_concrete, find_size, and find_dim all in
+ # a new class called ConcreteArray or some such because they will
+ # be the same for multi-dimensional arrays.
def get_concrete(self):
return self
def find_size(self):
return self.size
+ def find_ndim(self):
+ return self.ndim
+
def eval(self, i):
return self.storage[i]
@@ -490,11 +521,6 @@
def descr_len(self, space):
return space.wrap(self.size)
- descr_get_size = descr_len
-
- def descr_get_ndim(self, space):
- return space.wrap(1)
-
def getitem(self, item):
return self.storage[item]
More information about the pypy-commit
mailing list