Author: Ronan Lamy <[email protected]>
Branch: issue-2148
Changeset: r79984:8f424ea4ba98
Date: 2015-10-05 00:23 +0100
http://bitbucket.org/pypy/pypy/changeset/8f424ea4ba98/
Log: fast path for scalars in numpify()
diff --git a/pypy/module/micronumpy/ctors.py b/pypy/module/micronumpy/ctors.py
--- a/pypy/module/micronumpy/ctors.py
+++ b/pypy/module/micronumpy/ctors.py
@@ -150,11 +150,6 @@
dtype = descriptor.get_dtype_cache(space).w_uint8dtype
if dtype is None or (dtype.is_str_or_unicode() and dtype.elsize < 1):
dtype = find_dtype_for_seq(space, elems_w, dtype)
- if dtype is None:
- dtype = descriptor.get_dtype_cache(space).w_float64dtype
- elif dtype.is_str_or_unicode() and dtype.elsize < 1:
- # promote S0 -> S1, U0 -> U1
- dtype = descriptor.variable_dtype(space, dtype.char + '1')
w_arr = W_NDimArray.from_shape(space, shape, dtype, order=order)
if support.product(shape) == 1: # safe from overflow since from_shape
checks
@@ -175,23 +170,18 @@
return w_array
if is_scalar_like(space, w_object, dtype=None):
- shape, elems_w = [], [w_object]
dtype = scalar2dtype(space, w_object)
- else:
- shape, elems_w = _find_shape_and_elems(space, w_object)
- dtype = find_dtype_for_seq(space, elems_w, None)
- if dtype is None:
- dtype = descriptor.get_dtype_cache(space).w_float64dtype
- elif dtype.is_str_or_unicode() and dtype.elsize < 1:
- # promote S0 -> S1, U0 -> U1
- dtype = descriptor.variable_dtype(space, dtype.char + '1')
+ if dtype.is_str_or_unicode() and dtype.elsize < 1:
+ # promote S0 -> S1, U0 -> U1
+ dtype = descriptor.variable_dtype(space, dtype.char + '1')
+ return dtype.coerce(space, w_object)
- if len(elems_w) == 1:
- return dtype.coerce(space, elems_w[0])
- else:
- w_arr = W_NDimArray.from_shape(space, shape, dtype)
- loop.assign(space, w_arr, elems_w)
- return w_arr
+ shape, elems_w = _find_shape_and_elems(space, w_object)
+ dtype = find_dtype_for_seq(space, elems_w, None)
+ w_arr = W_NDimArray.from_shape(space, shape, dtype)
+ loop.assign(space, w_arr, elems_w)
+ return w_arr
+
def find_shape_and_elems(space, w_iterable, dtype):
if is_scalar_like(space, w_iterable, dtype):
@@ -269,6 +259,11 @@
return _dtype_guess(space, dtype, w_elem)
for w_elem in elems_w:
dtype = _dtype_guess(space, dtype, w_elem)
+ if dtype is None:
+ dtype = descriptor.get_dtype_cache(space).w_float64dtype
+ elif dtype.is_str_or_unicode() and dtype.elsize < 1:
+ # promote S0 -> S1, U0 -> U1
+ dtype = descriptor.variable_dtype(space, dtype.char + '1')
return dtype
diff --git a/pypy/module/micronumpy/test/test_scalar.py
b/pypy/module/micronumpy/test/test_scalar.py
--- a/pypy/module/micronumpy/test/test_scalar.py
+++ b/pypy/module/micronumpy/test/test_scalar.py
@@ -480,3 +480,9 @@
u = unicode_(u'Aÿ')
# raises(UnicodeEncodeError, "str(u)") # XXX
assert repr(u) == repr(u'Aÿ')
+
+ def test_binop_with_sequence(self):
+ import numpy as np
+ c = np.float64(1.) + [1.]
+ assert isinstance(c, np.ndarray)
+ assert (c == [2.]).all()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit