[Numpy-discussion] Enhancing dot()

Tim Hochberg tim.hochberg at cox.net
Fri Jul 7 02:53:29 EDT 2006


Bill Baxter wrote:
> On 7/7/06, *Tim Hochberg* <tim.hochberg at cox.net 
> <mailto:tim.hochberg at cox.net>> wrote:
>
>     > The funny thing is that having a dot(a,b,c,...) would lead to the
>     > exact same kind of hidden performance problems you're arguing
>     against.
>     Not exactly arguing -- this isn't why I don't like H and friends
>     -- just
>     noting that this is one of the traps that people are likely to
>     fall into
>     when transferring equations to code.
>
>
> There's a strong argument to be made that the whole design of most 
> array math packages is flawed and leads to inefficient code.  The 
> classic example is something like:
>   A = B + C - 2*D
> where all the matrices are 2million x 2million.  I think for numpy 
> that would basically do:
> tmp = B+C
> tmp2 = 2*D
> tmp3 = tmp - tmp2
> A = tmp3
>
> Allocating three huge tmp variables and probably doing an extra copy 
> or two in there, when the best thing to do would be more like:
> A = D
> A *= -2
> A += C
> A += B
>
> Or something like that.
Yeah -- that's not quite right since you've clobbered B.  But that is 
essentially the dark road that people go down in performance critical 
sections on occasion.

> The point is that you give up any notion of having optimal code the 
> minute you start using something like numpy.  And you do so happily 
> for the ability to get stuff done faster and have nicer looking, more 
> readable code in the end.  When everything works, that's when you hit 
> the "go fast button" if you even really need to.
That's what numexpr is for.

A = numexpr.evaluate("B + C - 2*D")

Evaluates this considerably faster than numpy and doesn't chew up all 
that extra memory. Actually that's why it's faster -- it's much more 
memory friendly. It's also a lot less flexible, although that's been 
improving. Still you want numpy as a base, but numexpr is a viable 
alternative for those critical sections where once you would resort to 
x= or worse, three argument ufuncs.

-tim


>
> --bb






More information about the NumPy-Discussion mailing list