Issue #23552: Timeit now warns when there is substantial (4x) variance

between best and worst times. Patch from Serhiy Storchaka.
This commit is contained in:
Robert Collins 2015-08-26 12:40:28 +12:00
parent 5eac15336a
commit 69de2a576c
2 changed files with 22 additions and 13 deletions

View File

@ -317,20 +317,26 @@ def main(args=None, *, _wrap_timer=None):
print("%d loops," % number, end=' ')
usec = best * 1e6 / number
if time_unit is not None:
print("best of %d: %.*g %s per loop" % (repeat, precision,
usec/units[time_unit], time_unit))
scale = units[time_unit]
else:
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))
scales = [(scale, unit) for unit, scale in units.items()]
scales.sort(reverse=True)
for scale, time_unit in scales:
if usec >= scale:
break
print("best of %d: %.*g %s per loop" % (repeat, precision,
usec/scale, time_unit))
best = min(r)
usec = best * 1e6 / number
worst = max(r)
if worst >= best * 4:
usec = worst * 1e6 / number
import warnings
warnings.warn_explicit(
"The test results are likely unreliable. The worst\n"
"time (%.*g %s) was more than four times slower than the best time." %
(precision, usec/scale, time_unit),
UserWarning, '', 0)
return None
if __name__ == "__main__":

View File

@ -17,6 +17,9 @@ Core and Builtins
Library
-------
- Issue #23552: Timeit now warns when there is substantial (4x) variance
between best and worst times. Patch from Serhiy Storchaka.
- Issue #24633: site-packages/README -> README.txt.
- Issue #24879: help() and pydoc can now list named tuple fields in the