diff -r 8f608a509d2c Lib/test/test_timeit.py --- a/Lib/test/test_timeit.py Sun Sep 08 20:32:49 2013 +0100 +++ b/Lib/test/test_timeit.py Sun Sep 08 20:33:22 2013 +0100 @@ -21,12 +21,14 @@ # number of loops during testing, but this would require changing the signature # of some functions that use the default as a default argument. + class FakeTimer: BASE_TIME = 42.0 + def __init__(self, seconds_per_increment=1.0): self.count = 0 self.setup_calls = 0 - self.seconds_per_increment=seconds_per_increment + self.seconds_per_increment = seconds_per_increment timeit._fake_timer = self def __call__(self): @@ -43,6 +45,7 @@ self.saved_timer = timer return self + class TestTimeit(unittest.TestCase): def tearDown(self): @@ -100,7 +103,7 @@ self.assertEqual(delta_time, number) # Takes too long to run in debug build. - #def test_timeit_default_iters(self): + # def test_timeit_default_iters(self): # self.timeit(self.fake_stmt, self.fake_setup) def test_timeit_zero_iters(self): @@ -114,17 +117,17 @@ def test_timeit_callable_stmt_and_setup(self): self.timeit(self.fake_callable_stmt, - self.fake_callable_setup, number=3) + self.fake_callable_setup, number=3) # Takes too long to run in debug build. - #def test_timeit_function(self): + # def test_timeit_function(self): # delta_time = timeit.timeit(self.fake_stmt, self.fake_setup, # timer=FakeTimer()) # self.assertEqual(delta_time, DEFAULT_NUMBER) def test_timeit_function_zero_iters(self): delta_time = timeit.timeit(self.fake_stmt, self.fake_setup, number=0, - timer=FakeTimer()) + timer=FakeTimer()) self.assertEqual(delta_time, 0) def repeat(self, stmt, setup, repeat=None, number=None): @@ -145,7 +148,7 @@ self.assertEqual(delta_times, repeat * [float(number)]) # Takes too long to run in debug build. - #def test_repeat_default(self): + # def test_repeat_default(self): # self.repeat(self.fake_stmt, self.fake_setup) def test_repeat_zero_reps(self): @@ -159,26 +162,26 @@ def test_repeat_callable_stmt(self): self.repeat(self.fake_callable_stmt, self.fake_setup, - repeat=3, number=5) + repeat=3, number=5) def test_repeat_callable_stmt_and_setup(self): self.repeat(self.fake_callable_stmt, self.fake_callable_setup, - repeat=3, number=5) + repeat=3, number=5) # Takes too long to run in debug build. - #def test_repeat_function(self): + # def test_repeat_function(self): # delta_times = timeit.repeat(self.fake_stmt, self.fake_setup, # timer=FakeTimer()) # self.assertEqual(delta_times, DEFAULT_REPEAT * [float(DEFAULT_NUMBER)]) def test_repeat_function_zero_reps(self): delta_times = timeit.repeat(self.fake_stmt, self.fake_setup, repeat=0, - timer=FakeTimer()) + timer=FakeTimer()) self.assertEqual(delta_times, []) def test_repeat_function_zero_iters(self): delta_times = timeit.repeat(self.fake_stmt, self.fake_setup, number=0, - timer=FakeTimer()) + timer=FakeTimer()) self.assertEqual(delta_times, DEFAULT_REPEAT * [0.0]) def assert_exc_string(self, exc_string, expected_exc_name): diff -r 8f608a509d2c Lib/timeit.py --- a/Lib/timeit.py Sun Sep 08 20:32:49 2013 +0100 +++ b/Lib/timeit.py Sun Sep 08 20:33:22 2013 +0100 @@ -73,10 +73,12 @@ return _t1 - _t0 """ + def reindent(src, indent): """Helper to reindent a multi-line statement.""" return src.replace("\n", "\n" + " "*indent) + def _template_func(setup, func): """Create a timer function. Used if the "statement" is a callable.""" def inner(_it, _timer, _func=func): @@ -88,7 +90,9 @@ return _t1 - _t0 return inner + class Timer: + """Class for timing execution speed of small code snippets. The constructor takes a statement to be timed, an additional @@ -118,7 +122,7 @@ ns['_setup'] = setup else: raise ValueError("setup is neither a string nor callable") - self.src = src # Save for traceback display + self.src = src # Save for traceback display code = compile(src, dummy_src_name, "exec") exec(code, globals(), ns) self.inner = ns["inner"] @@ -126,6 +130,7 @@ self.src = None if isinstance(setup, str): _setup = setup + def setup(): exec(_setup, globals(), ns) elif not callable(setup): @@ -151,7 +156,8 @@ The optional file argument directs where the traceback is sent; it defaults to sys.stderr. """ - import linecache, traceback + import linecache + import traceback if self.src is not None: linecache.cache[dummy_src_name] = (len(self.src), None, @@ -207,16 +213,19 @@ r.append(t) return r + def timeit(stmt="pass", setup="pass", timer=default_timer, number=default_number): """Convenience 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): """Convenience function to create Timer object and call repeat method.""" return Timer(stmt, setup, timer).repeat(repeat, number) + def main(args=None, *, _wrap_timer=None): """Main program, used when run as a script. @@ -248,7 +257,7 @@ return 2 timer = default_timer stmt = "\n".join(args) or "pass" - number = 0 # auto-determine + number = 0 # auto-determine setup = [] repeat = default_repeat verbose = 0 @@ -287,7 +296,7 @@ if number == 0: # determine number so that 0.2 <= total time < 2.0 for i in range(1, 10): - number = 10**i + number = 10 ** i try: x = t.timeit(number) except: