[Numpy-discussion] Simple multi-arg wrapper for dot()
Bill Baxter
wbaxter at gmail.com
Sat Mar 24 16:51:41 EDT 2007
On 3/25/07, Alan G Isaac <aisaac at american.edu> wrote:
> On Sun, 25 Mar 2007, Bill Baxter apparently wrote:
> > So if one just
> > changes the example to
> > reduce(lambda s, a: s * a.myattr, data, 1)
> > How does one write that in a simplified way using generator
> > expressions without calling on reduce?
>
>
> Eliminating the expressiveness of ``reduce`` has in my
> opinion never been publically justified.
Though the post on Guido's blog got lots of people jumping on the
witch-burning bandwagon for getting rid of reduce(). I think I saw
"good riddance" more than once. On the other hand slightly fewer
people people said "hey I use that!"
>
> E.g., ::
>
> #evaluate polynomial (coefs=[an,...,a0]) at x
> # using Horner's rule
> def horner(coefs, x):
> return reduce(lambda a1,a0: a1*x+a0, coefs)
>
> I suspect that ``reduce`` remains in danger only because the
> math community has been too quiet.
To be fair, the alternative is
def horner2(coefs, x):
ret = 0
for a in coefs: ret = ret*x + a
return ret
Which, though more typing, isn't really any harder or easier to read in my mind.
But there is a difference in timings:
In [107]: t1 = timeit.Timer('horner([4,3,2,1],2)','from __main__ import horner')
In [108]: t2 = timeit.Timer('horner2([4,3,2,1],2)','from __main__
import horner2')
In [111]: t1.timeit(), t2.timeit()
Out[111]: (2.463477341393947, 1.1736731903077064)
The explicit loop runs about twice as fast in this case.
I think it's fine for filter()/reduce()/map() to be taken out of
builtins and moved to a standard module, but it's not clear that
that's what they're going to do. That py3K web page just says "remove
reduce()... done".
--bb
More information about the NumPy-Discussion
mailing list