Which is faster?

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sat Aug 30 02:15:30 EDT 2008


On Fri, 29 Aug 2008 21:26:35 -0700, cnb wrote:

> def averageGrade(self):
>         tot = 0
>         for review in self.reviews:
>             tot += review.grade
>         return tot / len(self.reviews)
> 
> def av_grade(self):
>      return sum(review.grade for review in self.reviews) / \
>               len(self.reviews)

Re-writing the functions so they can be tested alone:

def averageGrade(alist):
    tot = 0.0
    for x in alist:
        tot += x
    return tot/len(alist)


def av_grade(alist):
    return sum(alist)/len(alist)


>>> from timeit import Timer
>>> # small amount of items
... alist = range(100)
>>> Timer('averageGrade(alist)',
... 'from __main__ import alist, averageGrade').repeat(number=100000)
[3.9559240341186523, 3.4910569190979004, 3.4856188297271729]
>>> 
>>> Timer('av_grade(alist)',
... 'from __main__ import alist, av_grade').repeat(number=100000)
[2.0255107879638672, 1.0968310832977295, 1.0733180046081543]


The version with sum() is much faster. How about with lots of data?

>>> alist = xrange(1000000)
>>> Timer('averageGrade(alist)',
... 'from __main__ import alist, averageGrade').repeat(number=50)
[17.699107885360718, 18.182793140411377, 18.651514053344727]
>>> 
>>> Timer('av_grade(alist)',
... 'from __main__ import alist, av_grade').repeat(number=50)
[17.125216007232666, 15.72636890411377, 16.309713840484619]

sum() is still a little faster.



-- 
Steven



More information about the Python-list mailing list