120 lines
2.9 KiB
Python
120 lines
2.9 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import json
|
|
import matplotlib.pyplot as plt
|
|
import matplotlib.patches as patches
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
OUTPUT_FILE = sys.argv[1]
|
|
BENCHMARK_FILE = Path(sys.argv[2])
|
|
|
|
YEAR = BENCHMARK_FILE.parts[1]
|
|
|
|
COLOURS = {"Python": "#3572A5", "Go": "#00ADD8"}
|
|
|
|
MAX_Y_VALUE = 1
|
|
|
|
runner_translation = {
|
|
"py": "Python",
|
|
"go": "Go",
|
|
}
|
|
|
|
benchmark_data = {
|
|
"Python": {},
|
|
"Go": {},
|
|
} # adding dicts here sets the order of points being plotted
|
|
|
|
with open(BENCHMARK_FILE) as f:
|
|
for line in f.readlines():
|
|
d = json.loads(line)
|
|
rn = runner_translation[d["runner"]]
|
|
benchmark_data[rn][f"{d['day']}.{d['part']}"] = d["avg"]
|
|
|
|
all_days = set()
|
|
|
|
for lang in benchmark_data:
|
|
for key in benchmark_data[lang]:
|
|
day = int(key.split(".", 1)[0])
|
|
all_days.add(day)
|
|
|
|
figure = plt.figure(figsize=(25 / 2, 5))
|
|
axp1 = figure.add_subplot(1, 2, 1)
|
|
axp2 = figure.add_subplot(1, 2, 2, sharey=axp1)
|
|
|
|
axp1.axhline(y=15, color="#fc8080", linestyle="--")
|
|
axp2.axhline(y=15, color="#fc8080", linestyle="--")
|
|
|
|
for i, language in enumerate(benchmark_data):
|
|
|
|
data = benchmark_data[language]
|
|
part_one_times = []
|
|
part_two_times = []
|
|
|
|
p1days = []
|
|
p2days = []
|
|
|
|
for key in data:
|
|
|
|
day = int(key.split(".", 1)[0])
|
|
|
|
if key.endswith(".1"):
|
|
if day not in p1days:
|
|
p1days.append(day)
|
|
part_one_times.append(data[key])
|
|
if key.endswith(".2"):
|
|
if day not in p2days:
|
|
p2days.append(day)
|
|
part_two_times.append(data[key])
|
|
|
|
colour = COLOURS.get(language)
|
|
|
|
p1 = axp1.scatter(p1days, part_one_times, color=colour)
|
|
p2 = axp2.scatter(p2days, part_two_times, color=colour)
|
|
|
|
for i, day in enumerate(p1days):
|
|
if i + 1 >= len(p1days):
|
|
continue
|
|
if p1days[i + 1] == day + 1:
|
|
axp1.plot(
|
|
(day, p1days[i + 1]),
|
|
(part_one_times[i], part_one_times[i + 1]),
|
|
"-",
|
|
color=colour,
|
|
)
|
|
|
|
for i, day in enumerate(p2days):
|
|
if i + 1 >= len(p2days):
|
|
continue
|
|
if p2days[i + 1] == day + 1:
|
|
axp2.plot(
|
|
(day, p2days[i + 1]),
|
|
(part_two_times[i], part_two_times[i + 1]),
|
|
"-",
|
|
color=colour,
|
|
)
|
|
|
|
figure.suptitle(f"Average {YEAR} challenge running time")
|
|
axp1.set_title("Part one")
|
|
axp2.set_title("Part two")
|
|
|
|
|
|
def do_auxillary_parts(axis):
|
|
plt.sca(axis)
|
|
plt.xticks(list(all_days), [str(y) for y in all_days])
|
|
plt.ylabel("Running time (log seconds)")
|
|
plt.yscale("log")
|
|
plt.xlabel("Day")
|
|
plt.legend(
|
|
handles=[patches.Patch(color=COLOURS[label], label=label) for label in COLOURS]
|
|
)
|
|
# plt.ylim([0, MAX_Y_VALUE])
|
|
# plt.legend(legends)
|
|
|
|
|
|
do_auxillary_parts(axp1)
|
|
do_auxillary_parts(axp2)
|
|
|
|
plt.tight_layout()
|
|
plt.savefig(OUTPUT_FILE)
|