Pythonic way to sum n-th list element?

Alex Martelli aleax at aleax.it
Fri Apr 18 17:54:46 EDT 2003


Tim Gahnström /Bladerman wrote:

> 
> "Evan Simpson" <evan at 4-am.com> wrote in
>> Guy Middleton wrote:
>> > >>> reduce(lambda a, b: a+b, [y[1] for y in x])
>> >
>> > But I don't really like lambda, is there a better way to do this?
>>
>> What's wrong with:
>>
>> t = 0
>> for y in x:
>>      t += y[1]
>>
>> The extra variable?  The number of lines?
> 
> I am really curious about that to, I would most definitley say that this
> is the most pythonic way. It is simple and easily readabel by anyone and I
> am sure it is just as fast any of the other way.

Quite.  Performance is easy to measure, rather than guess at:

[alex at lancelot python2.3]$ python -O timeit.py -s"lst=[('a',1), ('b',2), 
('c',3)]*100" -s'import operator' 'x=reduce(lambda x,y: x+y[1], lst, 0)'
1000 loops, best of 3: 235 usec per loop

[alex at lancelot python2.3]$ python -O timeit.py -s"lst=[('a',1), ('b',2), 
('c',3)]*100" -s'import operator' 'x=reduce(operator.add,[y[1] for y in 
lst])'
1000 loops, best of 3: 277 usec per loop

[alex at lancelot python2.3]$ python -O timeit.py -s"lst=[('a',1), ('b',2), 
('c',3)]*100" -s'import operator' 'x=0' 'for y in lst: x+=y[1]'
10000 loops, best of 3: 103 usec per loop

Using lists 10 or 100 times as long seems to show O(N) behavior for
each case, as could be expected.  So, the simplest (and I would agree
thereby most Pythonic) approach is over twice as fast as the fancy ones
(measurements on 2.2.2 seem to show similar results, all approaches
being about 20% slower than in 2.3, uniformly).


Alex






More information about the Python-list mailing list