[Python-checkins] cpython: Issue #23552: Timeit now warns when there is substantial (4x) variance

robert.collins python-checkins at python.org
Wed Aug 26 02:40:51 CEST 2015


https://hg.python.org/cpython/rev/2e9cf58c891d
changeset:   97511:2e9cf58c891d
user:        Robert Collins <rbtcollins at hp.com>
date:        Wed Aug 26 12:40:28 2015 +1200
summary:
  Issue #23552: Timeit now warns when there is substantial (4x) variance
between best and worst times. Patch from Serhiy Storchaka.

files:
  Lib/timeit.py |  32 +++++++++++++++++++-------------
  Misc/NEWS     |   3 +++
  2 files changed, 22 insertions(+), 13 deletions(-)


diff --git a/Lib/timeit.py b/Lib/timeit.py
--- a/Lib/timeit.py
+++ b/Lib/timeit.py
@@ -317,20 +317,26 @@
     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__":
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -17,6 +17,9 @@
 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

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list