On Wed, May 27, 2009 at 9:31 AM, Nicolas Rougier <Nicolas.Rougier@loria.fr> wrote:

Probably. Record arrays are stored like packed c structures and need to be unpacked by copying the bytes to aligned data types.

A note would be appropriate, yes. You should be able to do that, do you have edit permissions for the documentation?

Chuck

Hi,

I've written a very simple benchmark on recarrays:

import numpy, time

Z = numpy.zeros((100,100), dtype=numpy.float64)

Z_fast = numpy.zeros((100,100), dtype=[('x',numpy.float64),

('y',numpy.int32)])

Z_slow = numpy.zeros((100,100), dtype=[('x',numpy.float64),

('y',numpy.bool)])

t = time.clock()

for i in range(10000): Z*Z

print time.clock()-t

t = time.clock()

for i in range(10000): Z_fast['x']*Z_fast['x']

print time.clock()-t

t = time.clock()

for i in range(10000): Z_slow['x']*Z_slow['x']

print time.clock()-t

And got the following results:

0.23

0.37

3.96

Am I right in thinking that the last case is quite slow because of some

memory misalignment between float64 and bool or is there some machinery

behind that makes things slow in this case ?

Probably. Record arrays are stored like packed c structures and need to be unpacked by copying the bytes to aligned data types.

Should this be mentioned somewhere in the recarray documentation ?

A note would be appropriate, yes. You should be able to do that, do you have edit permissions for the documentation?

Chuck