Profiling, sum-comprehension vs reduce

cnb circularfunc at yahoo.se
Sat Sep 13 10:06:22 CEST 2008


This must be because of implementation right? Shouldn't reduce be
faster since it iterates once over the list?
doesnt sum first construct the list then sum it?

-----------------------

>>> ================================ RESTART ================================
>>>
reduce with named function:  37.9864357062
reduce with nested, named function:  39.4710288598
reduce with lambda:  39.2463927678
sum comprehension:  25.9530121845
>>> ================================ RESTART ================================
>>>
reduce with named function:  36.4529584067
reduce with nested, named function:  37.6278529813
reduce with lambda:  38.2629448715
sum comprehension:  26.0197561422
>>>



from timeit import Timer

def add(x,y):
    return x+y

def rednamed(lst):
    return reduce(add, lst)

def rednn(lst):
    def add2(x,y):
        return x+y
    return reduce(add2, lst)

def redlambda(lst):
    return reduce(lambda x,y:x+y, lst)

def com(lst):
    return sum(x for x in lst)

s = xrange(101)

t1 = Timer('rednamed(s)', 'from __main__ import rednamed, s')
t2 = Timer('rednn(s)', 'from __main__ import rednn, s')
t3 = Timer('redlambda(s)', 'from __main__ import redlambda, s')
t4 = Timer('com(s)', 'from __main__ import com, s')

print "reduce with named function: ", t1.timeit()
print "reduce with nested, named function: ", t2.timeit()
print "reduce with lambda: ", t3.timeit()
print "sum comprehension: ", t4.timeit()


---------------------------------------
also, using range instead of xrange doesnt seem to generate a
performance-penalty:

>>>
reduce with named function:  36.7560729087
reduce with nested, named function:  38.5393266463
reduce with lambda:  38.3852953378
sum comprehension:  27.9001007111
>>>



More information about the Python-list mailing list