[Numpy-discussion] optimization of arr**-2

Timothy Hochberg tim.hochberg@ieee....
Sun Jul 15 08:36:33 CDT 2007


On 7/15/07, Sebastian Haase <haase@msg.ucsf.edu> wrote:
>
> Hi,
> I compared for a 256x256 float32  normal-noise (x0=100,sigma=1) array
> the times to do
> 1./ (a*a)
> vs.
> a**-2
>
> >>> U.timeIt('1./(a*a)', 1000)
> (0.00090877471871, 0.00939644563778, 0.00120674694689, 0.000687777554628)
> >>> U.timeIt('a**-2', 1000)
> (0.00876591857354, 0.0263829620803, 0.00952076311375, 0.00173311803255)
>
> The numbers are min,max, mean, stddev over thousand runs.
> N.__version == 1.0.1
>
> The slowdown is almost 10 fold.  Similar tests for **-1, and **2  show
> that the corresponding times are identical - i.e. those cases are
> optimized to not call the pow routine.
>
> Can this be fixed for the **-2 case ?


Not without some testing and discussion. If I recall correctly, we fixed all
of the cases where the optimized case had the same accuracy as the
unoptimized case. Optimizing 'x**-2', because it involves two operations (*
and /), starts to become lose accuracy relative to pow(x,-2). The accuracy
loss is relatively minor however; an additional ULP (unit in last place) or
so, I believe. It's been a while however, so I may have the details
scrambled.

So, while I'm not dead set against it, I think we would definitely come to a
consensus on how much accuracy we are willing to forgo for these notational
conveniences. And document accordingly. The uncontroversial ones already got
optimized.

Then again, we could just leave things as they are and when you're hungry
for speed, you could use '1/x**2'.


-- 
.  __
.   |-\
.
.  tim.hochberg@ieee.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://projects.scipy.org/pipermail/numpy-discussion/attachments/20070715/2d6f5950/attachment.html 


More information about the Numpy-discussion mailing list