Clean up histogram __repr__
[python_utils.git] / unittest_utils.py
index 4a9669d3a21f66e35004e1968cc85b65d711fd5c..b9746a80307ad512cee993aca29449e365e998b6 100644 (file)
@@ -87,9 +87,7 @@ class PerfRegressionDataPersister(ABC):
         pass
 
     @abstractmethod
-    def save_performance_data(
-        self, method_id: str, data: Dict[str, List[float]]
-    ):
+    def save_performance_data(self, method_id: str, data: Dict[str, List[float]]):
         pass
 
     @abstractmethod
@@ -106,9 +104,7 @@ class FileBasedPerfRegressionDataPersister(PerfRegressionDataPersister):
         with open(self.filename, 'rb') as f:
             return pickle.load(f)
 
-    def save_performance_data(
-        self, method_id: str, data: Dict[str, List[float]]
-    ):
+    def save_performance_data(self, method_id: str, data: Dict[str, List[float]]):
         for trace in self.traces_to_delete:
             if trace in data:
                 data[trace] = []
@@ -138,9 +134,7 @@ class DatabasePerfRegressionDataPersister(PerfRegressionDataPersister):
         results.close()
         return ret
 
-    def save_performance_data(
-        self, method_id: str, data: Dict[str, List[float]]
-    ):
+    def save_performance_data(self, method_id: str, data: Dict[str, List[float]]):
         self.delete_performance_data(method_id)
         for (method_id, perf_data) in data.items():
             sql = 'INSERT INTO runtimes_by_function (function, runtime) VALUES '
@@ -164,6 +158,9 @@ def check_method_for_perf_regressions(func: Callable) -> Callable:
 
     @functools.wraps(func)
     def wrapper_perf_monitor(*args, **kwargs):
+        if config.config['unittests_ignore_perf']:
+            return func(*args, **kwargs)
+
         if config.config['unittests_persistance_strategy'] == 'FILE':
             filename = config.config['unittests_perfdb_filename']
             helper = FileBasedPerfRegressionDataPersister(filename)
@@ -174,9 +171,7 @@ def check_method_for_perf_regressions(func: Callable) -> Callable:
             )
             helper = DatabasePerfRegressionDataPersister(dbspec)
         else:
-            raise Exception(
-                'Unknown/unexpected --unittests_persistance_strategy value'
-            )
+            raise Exception('Unknown/unexpected --unittests_persistance_strategy value')
 
         func_id = function_utils.function_identifier(func)
         func_name = func.__name__
@@ -212,17 +207,11 @@ def check_method_for_perf_regressions(func: Callable) -> Callable:
             stdev = statistics.stdev(hist)
             logger.debug(f'For {func_name}, performance stdev={stdev}')
             slowest = hist[-1]
-            logger.debug(
-                f'For {func_name}, slowest perf on record is {slowest:f}s'
-            )
+            logger.debug(f'For {func_name}, slowest perf on record is {slowest:f}s')
             limit = slowest + stdev * 4
-            logger.debug(
-                f'For {func_name}, max acceptable runtime is {limit:f}s'
-            )
-            logger.debug(
-                f'For {func_name}, actual observed runtime was {run_time:f}s'
-            )
-            if run_time > limit and not config.config['unittests_ignore_perf']:
+            logger.debug(f'For {func_name}, max acceptable runtime is {limit:f}s')
+            logger.debug(f'For {func_name}, actual observed runtime was {run_time:f}s')
+            if run_time > limit:
                 msg = f'''{func_id} performance has regressed unacceptably.
 {slowest:f}s is the slowest runtime on record in {len(hist)} perf samples.
 It just ran in {run_time:f}s which is 4+ stdevs slower than the slowest.
@@ -289,6 +278,7 @@ class RecordStdout(object):
     ...     print("This is a test!")
     >>> print({record().readline()})
     {'This is a test!\\n'}
+    >>> record().close()
     """
 
     def __init__(self) -> None:
@@ -315,6 +305,7 @@ class RecordStderr(object):
     ...     print("This is a test!", file=sys.stderr)
     >>> print({record().readline()})
     {'This is a test!\\n'}
+    >>> record().close()
     """
 
     def __init__(self) -> None: