Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r72316:4d1d1c2d78ae
Date: 2014-07-02 17:37 +0200
http://bitbucket.org/pypy/pypy/changeset/4d1d1c2d78ae/

Log:    Issue #1790: implement numpy.empty() differently than numpy.zeros().

diff --git a/pypy/module/micronumpy/__init__.py 
b/pypy/module/micronumpy/__init__.py
--- a/pypy/module/micronumpy/__init__.py
+++ b/pypy/module/micronumpy/__init__.py
@@ -12,7 +12,7 @@
         'scalar' : 'ctors.build_scalar',
         'array': 'ctors.array',
         'zeros': 'ctors.zeros',
-        'empty': 'ctors.zeros',
+        'empty': 'ctors.empty',
         'empty_like': 'ctors.empty_like',
         'fromstring': 'ctors.fromstring',
         'frombuffer': 'ctors.frombuffer',
diff --git a/pypy/module/micronumpy/base.py b/pypy/module/micronumpy/base.py
--- a/pypy/module/micronumpy/base.py
+++ b/pypy/module/micronumpy/base.py
@@ -28,12 +28,12 @@
         self.implementation = implementation
 
     @staticmethod
-    def from_shape(space, shape, dtype, order='C', w_instance=None):
+    def from_shape(space, shape, dtype, order='C', w_instance=None, zero=True):
         from pypy.module.micronumpy import concrete
         from pypy.module.micronumpy.strides import calc_strides
         strides, backstrides = calc_strides(shape, dtype.base, order)
         impl = concrete.ConcreteArray(shape, dtype.base, order, strides,
-                                      backstrides)
+                                      backstrides, zero=zero)
         if w_instance:
             return wrap_impl(space, space.type(w_instance), w_instance, impl)
         return W_NDimArray(impl)
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
@@ -369,9 +369,11 @@
 
 
 class ConcreteArray(ConcreteArrayNotOwning):
-    def __init__(self, shape, dtype, order, strides, backstrides, 
storage=lltype.nullptr(RAW_STORAGE)):
+    def __init__(self, shape, dtype, order, strides, backstrides,
+                 storage=lltype.nullptr(RAW_STORAGE), zero=True):
         if storage == lltype.nullptr(RAW_STORAGE):
-            storage = dtype.itemtype.malloc(support.product(shape) * 
dtype.elsize)
+            storage = dtype.itemtype.malloc(support.product(shape) *
+                                            dtype.elsize, zero=zero)
         ConcreteArrayNotOwning.__init__(self, shape, dtype, order, strides, 
backstrides,
                                         storage)
 
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
@@ -91,13 +91,19 @@
     return w_arr
 
 
-def zeros(space, w_shape, w_dtype=None, w_order=None):
+def _zeros_or_empty(space, w_shape, w_dtype, w_order, zero):
     dtype = space.interp_w(descriptor.W_Dtype,
         space.call_function(space.gettypefor(descriptor.W_Dtype), w_dtype))
     if dtype.is_str_or_unicode() and dtype.elsize < 1:
         dtype = descriptor.variable_dtype(space, dtype.char + '1')
     shape = shape_converter(space, w_shape, dtype)
-    return W_NDimArray.from_shape(space, shape, dtype=dtype)
+    return W_NDimArray.from_shape(space, shape, dtype=dtype, zero=zero)
+
+def empty(space, w_shape, w_dtype=None, w_order=None):
+    return _zeros_or_empty(space, w_shape, w_dtype, w_order, zero=False)
+
+def zeros(space, w_shape, w_dtype=None, w_order=None):
+    return _zeros_or_empty(space, w_shape, w_dtype, w_order, zero=True)
 
 
 @unwrap_spec(subok=bool)
@@ -111,7 +117,8 @@
         if dtype.is_str_or_unicode() and dtype.elsize < 1:
             dtype = descriptor.variable_dtype(space, dtype.char + '1')
     return W_NDimArray.from_shape(space, w_a.get_shape(), dtype=dtype,
-                                  w_instance=w_a if subok else None)
+                                  w_instance=w_a if subok else None,
+                                  zero=False)
 
 
 def _fromstring_text(space, s, count, sep, length, dtype):
diff --git a/pypy/module/micronumpy/test/test_arrayops.py 
b/pypy/module/micronumpy/test/test_arrayops.py
--- a/pypy/module/micronumpy/test/test_arrayops.py
+++ b/pypy/module/micronumpy/test/test_arrayops.py
@@ -2,6 +2,20 @@
 
 
 class AppTestNumSupport(BaseNumpyAppTest):
+    def test_zeros(self):
+        from numpypy import zeros, empty
+        a = zeros(3)
+        assert len(a) == 3
+        assert a[0] == a[1] == a[2] == 0
+        a = empty(1000)
+        assert len(a) == 1000
+        for i in range(1000):
+            if a[i] != 0:
+                break
+        else:
+            raise AssertionError(
+                "empty() returned a zeroed out array of length 1000 
(unlikely)")
+
     def test_where(self):
         from numpypy import where, ones, zeros, array
         a = [1, 2, 3, 0, -3]
diff --git a/pypy/module/micronumpy/test/test_ndarray.py 
b/pypy/module/micronumpy/test/test_ndarray.py
--- a/pypy/module/micronumpy/test/test_ndarray.py
+++ b/pypy/module/micronumpy/test/test_ndarray.py
@@ -11,7 +11,7 @@
 class MockDtype(object):
     class itemtype(object):
         @staticmethod
-        def malloc(size):
+        def malloc(size, zero=True):
             return None
 
     def __init__(self):
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -117,8 +117,11 @@
     def __repr__(self):
         return self.__class__.__name__
 
-    def malloc(self, size):
-        return alloc_raw_storage(size, track_allocation=False, zero=True)
+    def malloc(self, size, zero=True):
+        if zero:
+            return alloc_raw_storage(size, track_allocation=False, zero=True)
+        else:
+            return alloc_raw_storage(size, track_allocation=False, zero=False)
 
 class Primitive(object):
     _mixin_ = True
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to