Author: Maciej Fijalkowski <[email protected]>
Branch:
Changeset: r58097:c62c6904e304
Date: 2012-10-13 12:04 +0200
http://bitbucket.org/pypy/pypy/changeset/c62c6904e304/
Log: an attempt to improve the fancy indexing situation untested
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
@@ -424,39 +424,44 @@
self._done = True
@jit.unroll_safe
- def get_index(self, space):
- return [space.wrap(i) for i in self.indexes]
+ def get_index(self, space, shapelen):
+ return [space.wrap(self.indexes[i]) for i in range(shapelen)]
getitem_int_driver = jit.JitDriver(name = 'numpy_getitem_int',
- greens = ['shapelen', 'indexlen', 'dtype'],
+ greens = ['shapelen', 'indexlen',
+ 'prefixlen', 'dtype'],
reds = ['arr', 'res', 'iter', 'indexes_w',
'prefix_w'])
def getitem_array_int(space, arr, res, iter_shape, indexes_w, prefix_w):
shapelen = len(iter_shape)
+ prefixlen = len(prefix_w)
indexlen = len(indexes_w)
dtype = arr.get_dtype()
iter = PureShapeIterator(iter_shape, indexes_w)
+ indexlen = len(indexes_w)
while not iter.done():
getitem_int_driver.jit_merge_point(shapelen=shapelen,
indexlen=indexlen,
dtype=dtype, arr=arr, res=res,
iter=iter, indexes_w=indexes_w,
- prefix_w=prefix_w)
+ prefix_w=prefix_w,
+ prefixlen=prefixlen)
# prepare the index
- index_w = [None] * len(indexes_w)
- for i in range(len(indexes_w)):
+ index_w = [None] * indexlen
+ for i in range(indexlen):
if iter.idx_w[i] is not None:
index_w[i] = iter.idx_w[i].getitem()
else:
index_w[i] = indexes_w[i]
- res.descr_setitem(space, space.newtuple(prefix_w +
- iter.get_index(space)),
+ res.descr_setitem(space, space.newtuple(prefix_w[:prefixlen] +
+ iter.get_index(space, shapelen)),
arr.descr_getitem(space, space.newtuple(index_w)))
iter.next()
return res
setitem_int_driver = jit.JitDriver(name = 'numpy_setitem_int',
- greens = ['shapelen', 'indexlen', 'dtype'],
+ greens = ['shapelen', 'indexlen',
+ 'prefixlen', 'dtype'],
reds = ['arr', 'iter', 'indexes_w',
'prefix_w', 'val_arr'])
@@ -464,21 +469,24 @@
prefix_w):
shapelen = len(iter_shape)
indexlen = len(indexes_w)
+ prefixlen = len(prefix_w)
dtype = arr.get_dtype()
iter = PureShapeIterator(iter_shape, indexes_w)
while not iter.done():
setitem_int_driver.jit_merge_point(shapelen=shapelen,
indexlen=indexlen,
dtype=dtype, arr=arr,
iter=iter, indexes_w=indexes_w,
- prefix_w=prefix_w, val_arr=val_arr)
+ prefix_w=prefix_w, val_arr=val_arr,
+ prefixlen=prefixlen)
# prepare the index
- index_w = [None] * len(indexes_w)
- for i in range(len(indexes_w)):
+ index_w = [None] * indexlen
+ for i in range(indexlen):
if iter.idx_w[i] is not None:
index_w[i] = iter.idx_w[i].getitem()
else:
index_w[i] = indexes_w[i]
- w_idx = space.newtuple(prefix_w + iter.get_index(space))
+ w_idx = space.newtuple(prefix_w[:prefixlen] + iter.get_index(space,
+ shapelen))
arr.descr_setitem(space, space.newtuple(index_w),
val_arr.descr_getitem(space, w_idx))
iter.next()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit