diff --git a/scripts/advanced_statistics.py b/scripts/advanced_statistics.py index 5f8a439..90f576c 100755 --- a/scripts/advanced_statistics.py +++ b/scripts/advanced_statistics.py @@ -22,18 +22,15 @@ for command, ts in zip(commands, times): iqr = p75 - p25 - print("Command '{}'".format(command)) - print(" runs: {:8d}".format(len(ts))) - print(" mean: {:8.3f} s".format(np.mean(ts))) - print(" stddev: {:8.3f} s".format(np.std(ts, ddof=1))) - print(" median: {:8.3f} s".format(np.median(ts))) - print(" min: {:8.3f} s".format(np.min(ts))) - print(" max: {:8.3f} s".format(np.max(ts))) + print(f"Command '{command}'") + print(f" runs: {len(ts):8d}") + print(f" mean: {np.mean(ts):8.3f} s") + print(f" stddev: {np.std(ts, ddof=1):8.3f} s") + print(f" median: {np.median(ts):8.3f} s") + print(f" min: {np.min(ts):8.3f} s") + print(f" max: {np.max(ts):8.3f} s") print() print(" percentiles:") - print(" P_05 .. P_95: {:.3f} s .. {:.3f} s".format(p05, p95)) - print( - " P_25 .. P_75: {:.3f} s .. {:.3f} s " - "(IQR = {:.3f} s)".format(p25, p75, iqr) - ) + print(f" P_05 .. P_95: {p05:.3f} s .. {p95:.3f} s") + print(f" P_25 .. P_75: {p25:.3f} s .. {p75:.3f} s " f"(IQR = {iqr:.3f} s)") print() diff --git a/scripts/plot_histogram.py b/scripts/plot_histogram.py index e1d2282..90d5f6a 100755 --- a/scripts/plot_histogram.py +++ b/scripts/plot_histogram.py @@ -6,7 +6,6 @@ import argparse import json import numpy as np import matplotlib.pyplot as plt -import matplotlib.font_manager parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("file", help="JSON file with benchmark results") @@ -16,10 +15,24 @@ parser.add_argument( ) parser.add_argument("--bins", help="Number of bins (default: auto)") parser.add_argument( - "--legend-location", help="Location of the legend on plot (default: upper center)", - choices=["upper center", "lower center", "right", "left", "best", "upper left", "upper right", "lower left", "lower right", "center left", "center right", "center"], - default="upper center" - ) + "--legend-location", + help="Location of the legend on plot (default: upper center)", + choices=[ + "upper center", + "lower center", + "right", + "left", + "best", + "upper left", + "upper right", + "lower left", + "lower right", + "center left", + "center right", + "center", + ], + default="upper center", +) parser.add_argument( "--type", help="Type of histogram (*bar*, barstacked, step, stepfilled)" ) @@ -62,11 +75,11 @@ plt.hist( range=(t_min, t_max), ) plt.legend( - loc=args.legend_location, - fancybox=True, - shadow=True, - prop={"size": 7, "family": ["Source Code Pro", "Fira Mono", "Courier New"]} - ) + loc=args.legend_location, + fancybox=True, + shadow=True, + prop={"size": 10, "family": ["Source Code Pro", "Fira Mono", "Courier New"]}, +) plt.xlabel("Time [s]") if args.title: diff --git a/scripts/plot_parametrized.py b/scripts/plot_parametrized.py index fce54de..0fbd67b 100755 --- a/scripts/plot_parametrized.py +++ b/scripts/plot_parametrized.py @@ -25,9 +25,7 @@ parser.add_argument( parser.add_argument( "--titles", help="Comma-separated list of titles for the plot legend" ) -parser.add_argument( - "-o", "--output", help="Save image to the given filename." -) +parser.add_argument("-o", "--output", help="Save image to the given filename.") args = parser.parse_args() if args.parameter_name is not None: @@ -38,7 +36,7 @@ if args.parameter_name is not None: def die(msg): - sys.stderr.write("fatal: %s\n" % (msg,)) + sys.stderr.write(f"fatal: {msg}\n") sys.exit(1) @@ -50,8 +48,7 @@ def extract_parameters(results): names = frozenset(names) if len(names) != 1: die( - "benchmarks must all have the same parameter name, but found: %s" - % sorted(names) + f"benchmarks must all have the same parameter name, but found: {sorted(names)}" ) return (next(iter(names)), list(values)) @@ -63,8 +60,7 @@ def unique_parameter(benchmark): die("benchmarks must have exactly one parameter, but found none") if len(params_dict) > 1: die( - "benchmarks must have exactly one parameter, but found multiple: %s" - % sorted(params_dict) + f"benchmarks must have exactly one parameter, but found multiple: {sorted(params_dict)}" ) [(name, value)] = params_dict.items() return (name, float(value)) @@ -79,8 +75,7 @@ for filename in args.file: (this_parameter_name, parameter_values) = extract_parameters(results) if parameter_name is not None and this_parameter_name != parameter_name: die( - "files must all have the same parameter name, but found %r vs. %r" - % (parameter_name, this_parameter_name) + f"files must all have the same parameter name, but found {parameter_name!r} vs. {this_parameter_name!r}" ) parameter_name = this_parameter_name diff --git a/scripts/plot_whisker.py b/scripts/plot_whisker.py index 2dbd002..1797955 100755 --- a/scripts/plot_whisker.py +++ b/scripts/plot_whisker.py @@ -15,17 +15,15 @@ import matplotlib.pyplot as plt parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("file", help="JSON file with benchmark results") parser.add_argument("--title", help="Plot Title") -parser.add_argument("--sort-by", choices=['median'], help="Sort method") +parser.add_argument("--sort-by", choices=["median"], help="Sort method") parser.add_argument( "--labels", help="Comma-separated list of entries for the plot legend" ) -parser.add_argument( - "-o", "--output", help="Save image to the given filename." -) +parser.add_argument("-o", "--output", help="Save image to the given filename.") args = parser.parse_args() -with open(args.file, encoding='utf-8') as f: +with open(args.file, encoding="utf-8") as f: results = json.load(f)["results"] if args.labels: @@ -34,7 +32,7 @@ else: labels = [b["command"] for b in results] times = [b["times"] for b in results] -if args.sort_by == 'median': +if args.sort_by == "median": medians = [b["median"] for b in results] indices = sorted(range(len(labels)), key=lambda k: medians[k]) labels = [labels[i] for i in indices] @@ -53,7 +51,7 @@ if args.title: plt.legend(handles=boxplot["boxes"], labels=labels, loc="best", fontsize="medium") plt.ylabel("Time [s]") plt.ylim(0, None) -plt.xticks(list(range(1, len(labels)+1)), labels, rotation=45) +plt.xticks(list(range(1, len(labels) + 1)), labels, rotation=45) if args.output: plt.savefig(args.output) else: diff --git a/scripts/welch_ttest.py b/scripts/welch_ttest.py index dad8aa0..a5eb432 100755 --- a/scripts/welch_ttest.py +++ b/scripts/welch_ttest.py @@ -20,19 +20,19 @@ if len(results) != 2: print("The input file has to contain exactly two benchmarks") sys.exit(1) -a, b = [x["command"] for x in results[:2]] -X, Y = [x["times"] for x in results[:2]] +a, b = (x["command"] for x in results[:2]) +X, Y = (x["times"] for x in results[:2]) -print("Command 1: {}".format(a)) -print("Command 2: {}\n".format(b)) +print(f"Command 1: {a}") +print(f"Command 2: {b}\n") t, p = stats.ttest_ind(X, Y, equal_var=False) th = 0.05 dispose = p < th -print("t = {:.3}, p = {:.3}".format(t, p)) +print(f"t = {t:.3}, p = {p:.3}") print() if dispose: - print("There is a difference between the two benchmarks (p < {}).".format(th)) + print(f"There is a difference between the two benchmarks (p < {th}).") else: - print("The two benchmarks are almost the same (p >= {}).".format(th)) + print(f"The two benchmarks are almost the same (p >= {th}).")