[Numpy-discussion] python numpy code many times slower than c++

Neal Becker ndbecker2 at gmail.com
Wed Jan 21 16:34:35 EST 2009


Neal Becker wrote:

> Ravi wrote:
> 
>> On Wednesday 21 January 2009 13:55:49 Neal Becker wrote:
>>> I'm only interested in simple strided 1-d vectors.  In that case, I
>>> think your code already works.  If you have c++ code using the iterator
>>> interface, the iterators dereference will  use (*array )[index].  This
>>> will use operator[], which will call PyArray_GETPTR.  So I think this
>>> will obey strides.
>> 
>> You are right. I had forgotten that I had simple strided vectors working.
>> 
>>> Unfortunately, it will also be slow.  I suggest something like the
>>> enclosed.   I have done some simple tests, and it seems to work.
>> 
>> I wonder why PyArray_GETPTR1 is slow. Is it because of the implied
>> integer multiplication? Unfortunately, your approach means that iterators
>> can become invalid if the underlying array is resized to a larger size.
>> Hmmh, perhaps we could make this configurable at compile-time ...
>> 

Iterators almost always become invalid under those sorts of changes, so I 
don't think that's a surprise.

GETPTR1 has to do:
PyArray_STRIDES(obj)[0]
There's several memory references there, and I don't think the compiler can 
assume that this value doesn't change from one access to another - so it 
can't be cached.

That said, I have tried a few benchmarks.  Surprisingly, I'm not seeing any 
difference in a few quick tests.

I do have one cosmetic patch for you.  This will shutup gcc giving the 
longest warning message ever about an unused variable:
--- numpy.new.orig/numpyregister.hpp	2009-01-21 15:59:00.000000000 -0500
+++ numpy.new/numpyregister.hpp	2009-01-21 14:11:00.000000000 -0500
@@ -257,7 +257,8 @@
     storage_t *the_storage = reinterpret_cast<storage_t*>( data );
     void *memory_chunk = the_storage->storage.bytes;
     array_storage_t dd( obj );
-    array_t *v = new ( memory_chunk ) array_t( dd.size(), dd );
+    //array_t *v = new ( memory_chunk ) array_t( dd.size(), dd );
+    new ( memory_chunk ) array_t( dd.size(), dd );
     data->convertible = memory_chunk;
   }






More information about the NumPy-Discussion mailing list