[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