A quick recap of the problem:  a 128x512 array of 7-element vectors (element), 
and a 5000-vector
training dataset (targets).  For each vector in element, I want to find the 
best-match in targets,
defined as minimizing the Euclidean distance.

I coded it up three ways: (a) looping through each vector in element 
individually, (b) vectorizing
the function in the previous step, and coding it up in Fortran.  The heart of 
the "find-best-match"
code in Python looks like so I'm not doing an individual loop through all 5000 
vectors in targets:

    nlen = xelement.shape[0]
    nvec = targets.data.shape[0]
    x = xelement.reshape(1, nlen).repeat(nvec, axis=0)

    diffs = ((x - targets.data)**2).sum(axis=1)
    diffs = numpy.sqrt(diffs)
    return int(numpy.argmin(diffs, axis=0))

Here are the results:

(a) looping through each vector:  68 seconds
(b) vectorizing this:             58 seconds
(c) raw Fortran with loops:       26 seconds

I was surprised to see that vectorizing didn't gain me that much time, and that 
the Fortran
was so much faster than both python alternatives.  So, there's a lot that I 
don't know about
how the internals of numpy and python work.

Why does the loop through 128x512 elements in python only take an additional 10 
seconds?  What
is the main purpose of vectorizing - is it optimization by taking the looping 
step out of the
Python and into the C-base or something different?

And, why is the Fortran so much faster (even without optimization)?

It looks like I'll be switching to Fortran after all.  

Catherine

_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to