[pypy-commit] pypy default: use timsort in astype to ascertain stride pattern, but create a continuous array
mattip
noreply at buildbot.pypy.org
Sun Sep 27 11:57:30 CEST 2015
Author: mattip <matti.picus at gmail.com>
Branch:
Changeset: r79861:1bba158521bb
Date: 2015-09-27 02:36 +0300
http://bitbucket.org/pypy/pypy/changeset/1bba158521bb/
Log: use timsort in astype to ascertain stride pattern, but create a
continuous array
diff --git a/pypy/module/micronumpy/concrete.py b/pypy/module/micronumpy/concrete.py
--- a/pypy/module/micronumpy/concrete.py
+++ b/pypy/module/micronumpy/concrete.py
@@ -1,6 +1,7 @@
from pypy.interpreter.error import OperationError, oefmt
from rpython.rlib import jit, rgc
from rpython.rlib.rarithmetic import ovfcheck
+from rpython.rlib.listsort import make_timsort_class
from rpython.rlib.buffer import Buffer
from rpython.rlib.debug import make_sure_not_resized
from rpython.rlib.rawstorage import alloc_raw_storage, free_raw_storage, \
@@ -354,12 +355,17 @@
elif order != self.order:
t_strides, backstrides = calc_strides(shape, dtype, order)
else:
- mins = strides[0]
+ def arg_lt(a, b):
+ return strides[a] < strides[b]
+ ArgSort=make_timsort_class(lt=arg_lt)
+ indx_array = range(len(strides))
+ ArgSort(indx_array).sort()
t_elsize = dtype.elsize
- for s in strides:
- if s < mins:
- mins = s
- t_strides = [s * t_elsize / mins for s in strides]
+ t_strides = strides[:]
+ base = dtype.elsize
+ for i in indx_array:
+ t_strides[i] = base
+ base *= shape[i]
backstrides = calc_backstrides(t_strides, shape)
impl = ConcreteArray(shape, dtype, order, t_strides, backstrides)
loop.setslice(space, impl.get_shape(), impl, self)
More information about the pypy-commit
mailing list