diff -r aea58e1cae75 Doc/library/timeit.rst --- a/Doc/library/timeit.rst Sun Sep 08 14:14:38 2013 +0200 +++ b/Doc/library/timeit.rst Sun Sep 08 20:32:44 2013 +0100 @@ -29,11 +29,11 @@ .. code-block:: sh $ python -m timeit '"-".join(str(n) for n in range(100))' - 10000 loops, best of 3: 40.3 usec per loop + 10000 loops, best of 3: 34.6 usec per loop (28 870 loops/s) $ python -m timeit '"-".join([str(n) for n in range(100)])' - 10000 loops, best of 3: 33.4 usec per loop + 10000 loops, best of 3: 31 usec per loop (32 278 loops/s) $ python -m timeit '"-".join(map(str, range(100)))' - 10000 loops, best of 3: 25.2 usec per loop + 10000 loops, best of 3: 25.6 usec per loop (39 128 loops/s) This can be achieved from the :ref:`python-interface` with:: @@ -239,9 +239,9 @@ .. code-block:: sh $ python -m timeit -s 'text = "sample string"; char = "g"' 'char in text' - 10000000 loops, best of 3: 0.0877 usec per loop + 10000000 loops, best of 3: 0.0574 usec per loop (17 415 738 loops/s) $ python -m timeit -s 'text = "sample string"; char = "g"' 'text.find(char)' - 1000000 loops, best of 3: 0.342 usec per loop + 1000000 loops, best of 3: 0.225 usec per loop (4 440 226 loops/s) :: @@ -268,14 +268,14 @@ .. code-block:: sh $ python -m timeit 'try:' ' str.__bool__' 'except AttributeError:' ' pass' - 100000 loops, best of 3: 15.7 usec per loop + 1000000 loops, best of 3: 0.701 usec per loop (1 425 528 loops/s) $ python -m timeit 'if hasattr(str, "__bool__"): pass' - 100000 loops, best of 3: 4.26 usec per loop + 1000000 loops, best of 3: 0.529 usec per loop (1 890 741 loops/s) $ python -m timeit 'try:' ' int.__bool__' 'except AttributeError:' ' pass' - 1000000 loops, best of 3: 1.43 usec per loop + 10000000 loops, best of 3: 0.0689 usec per loop (14 522 881 loops/s) $ python -m timeit 'if hasattr(int, "__bool__"): pass' - 100000 loops, best of 3: 2.23 usec per loop + 10000000 loops, best of 3: 0.154 usec per loop (6 497 353 loops/s) :: diff -r aea58e1cae75 Lib/test/test_timeit.py --- a/Lib/test/test_timeit.py Sun Sep 08 14:14:38 2013 +0200 +++ b/Lib/test/test_timeit.py Sun Sep 08 20:32:44 2013 +0100 @@ -196,7 +196,7 @@ t.print_exc(s) self.assert_exc_string(s.getvalue(), 'ZeroDivisionError') - MAIN_DEFAULT_OUTPUT = "10 loops, best of 3: 1 sec per loop\n" + MAIN_DEFAULT_OUTPUT = "10 loops, best of 3: 1 sec per loop (1.000 loops/s)\n" def run_main(self, seconds_per_increment=1.0, switches=None, timer=None): if timer is None: @@ -222,33 +222,39 @@ def test_main_seconds(self): s = self.run_main(seconds_per_increment=5.5) - self.assertEqual(s, "10 loops, best of 3: 5.5 sec per loop\n") + self.assertEqual( + s, "10 loops, best of 3: 5.5 sec per loop (0.182 loops/s)\n") def test_main_milliseconds(self): s = self.run_main(seconds_per_increment=0.0055) - self.assertEqual(s, "100 loops, best of 3: 5.5 msec per loop\n") + self.assertEqual( + s, "100 loops, best of 3: 5.5 msec per loop (182 loops/s)\n") def test_main_microseconds(self): s = self.run_main(seconds_per_increment=0.0000025, switches=['-n100']) - self.assertEqual(s, "100 loops, best of 3: 2.5 usec per loop\n") + self.assertEqual( + s, "100 loops, best of 3: 2.5 usec per loop (400 000 loops/s)\n") def test_main_fixed_iters(self): s = self.run_main(seconds_per_increment=2.0, switches=['-n35']) - self.assertEqual(s, "35 loops, best of 3: 2 sec per loop\n") + self.assertEqual( + s, "35 loops, best of 3: 2 sec per loop (0.500 loops/s)\n") def test_main_setup(self): s = self.run_main(seconds_per_increment=2.0, - switches=['-n35', '-s', 'print("CustomSetup")']) + switches=['-n35', '-s', 'print("CustomSetup")']) self.assertEqual(s, "CustomSetup\n" * 3 + - "35 loops, best of 3: 2 sec per loop\n") + "35 loops, best of 3: 2 sec per loop (0.500 loops/s)\n") def test_main_fixed_reps(self): s = self.run_main(seconds_per_increment=60.0, switches=['-r9']) - self.assertEqual(s, "10 loops, best of 9: 60 sec per loop\n") + self.assertEqual( + s, "10 loops, best of 9: 60 sec per loop (0.017 loops/s)\n") def test_main_negative_reps(self): s = self.run_main(seconds_per_increment=60.0, switches=['-r-5']) - self.assertEqual(s, "10 loops, best of 1: 60 sec per loop\n") + self.assertEqual( + s, "10 loops, best of 1: 60 sec per loop (0.017 loops/s)\n") @unittest.skipIf(sys.flags.optimize >= 2, "need __doc__") def test_main_help(self): @@ -274,7 +280,7 @@ self.assertEqual(s, dedent("""\ 10 loops -> 10 secs raw times: 10 10 10 - 10 loops, best of 3: 1 sec per loop + 10 loops, best of 3: 1 sec per loop (1.000 loops/s) """)) def test_main_very_verbose(self): @@ -285,7 +291,7 @@ 1000 loops -> 0.05 secs 10000 loops -> 0.5 secs raw times: 0.5 0.5 0.5 - 10000 loops, best of 3: 50 usec per loop + 10000 loops, best of 3: 50 usec per loop (20 000 loops/s) """)) def test_main_exception(self): diff -r aea58e1cae75 Lib/timeit.py --- a/Lib/timeit.py Sun Sep 08 14:14:38 2013 +0200 +++ b/Lib/timeit.py Sun Sep 08 20:32:44 2013 +0100 @@ -305,17 +305,27 @@ best = min(r) if verbose: print("raw times:", " ".join(["%.*g" % (precision, x) for x in r])) - print("%d loops," % number, end=' ') - usec = best * 1e6 / number - if usec < 1000: - print("best of %d: %.*g usec per loop" % (repeat, precision, usec)) - else: - msec = usec / 1000 - if msec < 1000: - print("best of %d: %.*g msec per loop" % (repeat, precision, msec)) - else: - sec = msec / 1000 - print("best of %d: %.*g sec per loop" % (repeat, precision, sec)) + + sec = best / number + duration = sec * 1e6 + unit = 'usec' + + if duration >= 1000: + unit = 'msec' + duration /= 1000 + + if duration >= 1000: + unit = 'sec' + duration /= 1000 + + per_second = 1 / sec + per_second_formatted = '{:,.{precision}f}'.format( + per_second, precision=0 if per_second >= 100 else precision).replace(',', ' ') + + print("{0} loops, best of {1}: {2:.{precision}g} {3} per loop " + "({per_second} loops/s)".format( + number, repeat, duration, unit, precision=precision, + per_second=per_second_formatted)) return None if __name__ == "__main__":