reduce()--what is it good for? (was: Re: reduce() anomaly?)

Alex Martelli aleaxit at yahoo.com
Wed Nov 5 18:13:53 EST 2003


Erik Max Francis wrote:
   ...
> Francis Avila wrote:
> 
>> Just out of curiosity, for what kind of problems do we find reduce to
>> just
>> be the Right Way?  I mean, summing a big list of numbers is fun and
>> all, but
>> I never find any use for it otherwise.  I *often* try to think if
   ...
> I don't use reduce extremely routinely, but I certainly do find myself
> using it.  Grepping through my Python sources, the most common uses I
> find are summing together lists of numeric values and joining together

In Python 2.3, we have sum for that (much faster, too).

> (flattening) a list of lists (though only when the contained lists
> themselves do not contain any sequences as elements).

_UN_fortunately sums works for that too -- but almost as slowly as reduce.
E.g., on a small example:

[alex at lancelot bo]$ timeit.py -c -s'lol=[range(20)]*20' 
'reduce(list.__add__, lol, [])'
10000 loops, best of 3: 91 usec per loop

[alex at lancelot bo]$ timeit.py -c -s'lol=[range(20)]*20' -s'import operator' 
'reduce(operator.add, lol, [])'
10000 loops, best of 3: 88 usec per loop

[alex at lancelot bo]$ timeit.py -c -s'lol=[range(20)]*20' 'sum(lol, [])'
10000 loops, best of 3: 82 usec per loop

while a simple loop is way faster:

[alex at lancelot bo]$ timeit.py -c -s'lol=[range(20)]*20' 'x=[]' 'for l in 
lol: x.extend(l)'
10000 loops, best of 3: 26 usec per loop

and can easily be sped up a little more:

[alex at lancelot bo]$ timeit.py -c -s'lol=[range(20)]*20' 'x=[]' 'xe=x.extend' 
'for l in lol: xe(l)'
10000 loops, best of 3: 20 usec per loop


Given the typical use cases of reduce are covered by sum -- and sometimes
even better by simple loops &c -- then I would say that in Python 2.3 and
following reduce should not be used often at all.


Alex





More information about the Python-list mailing list