timeit: start autorange with 1 iteration, not 10
Issue #28240: timeit autorange now uses a single loop iteration if the
benchmark takes less than 10 seconds, instead of 10 iterations.
"python3 -m timeit -s 'import time' 'time.sleep(1)'" now takes 4 seconds
instead of 40 seconds.
diff --git a/Lib/timeit.py b/Lib/timeit.py
index 2770efa..0040efd 100644
--- a/Lib/timeit.py
+++ b/Lib/timeit.py
@@ -218,7 +218,7 @@
If *callback* is given and is not None, it will be called after
each trial with two arguments: ``callback(number, time_taken)``.
"""
- for i in range(1, 10):
+ for i in range(0, 10):
number = 10**i
time_taken = self.timeit(number)
if callback:
@@ -318,8 +318,10 @@
callback = None
if verbose:
def callback(number, time_taken):
- msg = "{num} loops -> {secs:.{prec}g} secs"
- print(msg.format(num=number, secs=time_taken, prec=precision))
+ msg = "{num} loop{s} -> {secs:.{prec}g} secs"
+ plural = (number != 1)
+ print(msg.format(num=number, s='s' if plural else '',
+ secs=time_taken, prec=precision))
try:
number, _ = t.autorange(callback)
except:
@@ -333,7 +335,7 @@
best = min(r)
if verbose:
print("raw times:", " ".join(["%.*g" % (precision, x) for x in r]))
- print("%d loops," % number, end=' ')
+ print("%d loop%s," % (number, 's' if number != 1 else ''), end=' ')
usec = best * 1e6 / number
if time_unit is not None:
scale = units[time_unit]