[Tutor] timeit at the command line

Kent Johnson kent37 at tds.net
Tue Oct 3 16:08:07 CEST 2006


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.

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.

Does that help?
Kent



More information about the Tutor mailing list