[Tutor] timeit at the command line

Dick Moores rdm at rcblue.com
Tue Oct 3 17:13:52 CEST 2006


At 07:08 AM 10/3/2006, Kent Johnson wrote:
>Dick Moores wrote:
> > At 05:54 AM 10/3/2006, Kent Johnson wrote:
> >> Dick Moores wrote:
> >>> Very interesting. I thought a line of that template looked
> >>> familiar. I was seeing "_t0 = _timer()" regularly when I had the -s
> >>> option set without any setup:
> >>> C:\>python -m timeit  -r 3 -s"for x in range(10000):" " x*x"
> >>> Traceback (most recent call last):
> >>>    File "E:\Python25\lib\runpy.py", line 95, in run_module
> >>>      filename, loader, alter_sys)
> >>>    File "E:\Python25\lib\runpy.py", line 52, in _run_module_co
> >>>      mod_name, mod_fname, mod_loader)
> >>>    File "E:\Python25\lib\runpy.py", line 32, in _run_code
> >>>      exec code in run_globals
> >>>    File "E:\Python25\lib\timeit.py", line 285, in <module>
> >>>      sys.exit(main())
> >>>    File "E:\Python25\lib\timeit.py", line 249, in main
> >>>      t = Timer(stmt, setup, timer)
> >>>    File "E:\Python25\lib\timeit.py", line 116, in __init__
> >>>      code = compile(src, dummy_src_name, "exec")
> >>>    File "<timeit-src>", line 4
> >>>      _t0 = _timer()
> >>>        ^
> >>> But I don't understand what the error has to do with _t0 . That's
> >>> OK, don't bother to explain. I don't understand classes yet anyway.
> >>> Should get into them soon, with Wes Chun's book.
> >> If you substitute your code into the template by hand and look at
> >> the actual exception (not shown above) you should see the problem.
> >> It doesn't have anything to do with classes.
> >
> > I meant timeit.py has classes.
> >
> > OK, I called timeit.py with this template:
> >
> > template = """
> > def inner(_it, _timer):
> >      %(setup)s
> >      _t0 = _timer()
> >      for _i in _it:
> >          %("x=0" "while x<100": " x*x")s
> >      _t1 = _timer()
> >      return _t1 - _t0
> > """
>
>OK, let's go back to your first example and I will explain in more detail.

Sorry to be so dumb.


>timeit.py contains this template:
>template = """
>def inner(_it, _timer):
>      %(setup)s
>      _t0 = _timer()
>      for _i in _it:
>          %(stmt)s
>      _t1 = _timer()
>      return _t1 - _t0
>"""
>
>Whatever you specify for setup code is substituted for %(setup)s; the
>timed statement is substituted for %(stmt)s. This is done using standard
>string formatting operations. The result of the substitutions is a
>function definition which is compiled and run.
>
>So if you run
>python -m timeit -s"for x in range(10000):" " x*x"
>
>the generated function looks like this:
>def inner(_it, _timer):
>      for x in range(10000):
>      _t0 = _timer()
>      for _i in _it:
>           x*x
>      _t1 = _timer()
>      return _t1 - _t0
>
>The for statement should begin an indented block; the next statement is
>*not* indented, so you get an IndentationError.

Yes, that's exactly what I got when using timeit with that code at 
the command line, which I didn't understand.  John Fouhy explained it.

>Does that help?

Yes, you've shown me a couple of things. How to substitute in a 
template. How it can be useful to look at the code of modules. And in 
this case I'll be able to use that template in a copy of timeit.py 
without going to the command line, with which I usually struggle.

Thanks again, again.

Dick

>Kent
>
>_______________________________________________
>Tutor maillist  -  Tutor at python.org
>http://mail.python.org/mailman/listinfo/tutor




More information about the Tutor mailing list