]> granicus.if.org Git - python/commitdiff
Issue #23552: Timeit now warns when there is substantial (4x) variance
authorRobert Collins <rbtcollins@hp.com>
Wed, 26 Aug 2015 00:40:28 +0000 (12:40 +1200)
committerRobert Collins <rbtcollins@hp.com>
Wed, 26 Aug 2015 00:40:28 +0000 (12:40 +1200)
between best and worst times. Patch from Serhiy Storchaka.

Lib/timeit.py
Misc/NEWS

index 2de88f7271a073c24183466b54c5615424d078b4..98cb3eb89a82e03796f9ea1ab931b6a2f923ed39 100755 (executable)
@@ -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__":
index dabbeea542f73a4305197eb2ad801530d86c824d..3404b092a9b40e68ed1c9cdc7c83c1dc6025265e 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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