[Tutor] List comprehension question

Steven D'Aprano steve at pearwood.info
Sat Nov 13 00:26:17 CET 2010

Richard D. Moores wrote:

> OK, but why can't I do what the timeit doc suggests, only put 2 or
> more functions in the file, as I do here:
> <http://tutoree7.pastebin.com/84u1fkgA>
> def test():
>     "Stupid test function"
>     L = []
>     for i in range(100):
>         L.append(i)
> if __name__=='__main__':
>     from timeit import Timer
>     t = Timer("test()", "from __main__ import test")
>     print t.timeit()

There's nothing wrong with that, except that running the test *once* (as 
you do) is subject to greater chance fluctuations than running it 
multiple times: change the last line to:

print min(t.repeat())

Note that you don't *have* to do this, the world will not end if you 
don't, but your timing results will be just a little more accurate if 
you do.

If you want to time multiple functions, just use multiple timer objects:

t1 = Timer("test()", "from __main__ import test")
t2 = Timer("spam()", "from module import spam")
t3 = Timer("ham()", "from module import ham")

> I'm sorry, Steven, but I could you revise this code to use repeat=5
> instead of the for loop? I can't see how to do it.

You don't need to choose repeat=5. The default is 3, but you can specify 
any number you like. I just like 5 :)

> if __name__=='__main__':
>     from timeit import Timer
>     for y in range(5):
>         t = Timer("proper_divisors_sum1(500000)", "from __main__
> import proper_divisors_sum")
>         print round(t.timeit(number=10000),3)

if __name__=='__main__':
     from timeit import Timer
     t = Timer("proper_divisors_sum(500000)",
         "from __main__ import proper_divisors_sum")
     best = t.repeat(number=10000, repeat=5)
     print round(best, 3)


More information about the Tutor mailing list