--- timeit.py.orig 2006-08-03 08:46:50.000000000 -0400 +++ timeit.py 2006-08-03 10:23:02.000000000 -0400 @@ -90,6 +90,16 @@ """Helper to reindent a multi-line statement.""" return src.replace("\n", "\n" + " "*indent) +def template_func(setup, func): + def inner (it, timer): + setup() + t0 = timer() + for i in it: + func() + t1 = timer() + return t1 - t0 + return inner + class Timer: """Class for timing execution speed of small code snippets. @@ -109,14 +119,26 @@ def __init__(self, stmt="pass", setup="pass", timer=default_timer): """Constructor. See class doc string.""" self.timer = timer - stmt = reindent(stmt, 8) - setup = reindent(setup, 4) - src = template % {'stmt': stmt, 'setup': setup} - self.src = src # Save for traceback display - code = compile(src, dummy_src_name, "exec") ns = {} - exec code in globals(), ns - self.inner = ns["inner"] + if isinstance(stmt, str): + stmt = reindent(stmt, 8) + if isinstance(setup, str): + setup = reindent(setup, 4) + src = template % {'stmt': stmt, 'setup': setup} + else: + src = template % {'stmt': stmt, 'setup': '_setup'} + ns['_setup'] = setup + self.src = src # Save for traceback display + code = compile(src, dummy_src_name, "exec") + exec code in globals(), ns + self.inner = ns["inner"] + else: + self.src = None + if isinstance(setup, str): + _setup = setup + def setup(): + exec _setup in globals(), ns + self.inner = template_func(setup, stmt) def print_exc(self, file=None): """Helper to print a traceback from the timed code. @@ -136,10 +158,11 @@ sent; it defaults to sys.stderr. """ import linecache, traceback - linecache.cache[dummy_src_name] = (len(self.src), - None, - self.src.split("\n"), - dummy_src_name) + if self.src is not None: + linecache.cache[dummy_src_name] = (len(self.src), + None, + self.src.split("\n"), + dummy_src_name) traceback.print_exc(file=file) def timeit(self, number=default_number): @@ -189,6 +212,16 @@ r.append(t) return r +def timeit(stmt="pass", setup="pass", timer=default_timer, + number=default_number): + """Helper function to create Timer object and call timeit method.""" + return Timer(stmt, setup, timer).timeit(number) + +def repeat(stmt="pass", setup="pass", timer=default_timer, + repeat=default_repeat, number=default_number): + """Helper function to create Timer object and call repeat method.""" + return Timer(stmt, setup, timer).repeat(repeat, number) + def main(args=None): """Main program, used when run as a script.