Files
adventofcode/2018/other/runtimes.py
2018-12-31 18:33:58 +01:00

53 lines
1.2 KiB
Python
Executable File

#!/usr/bin/env python3
import fileinput
import re
import numpy as np
import matplotlib.pyplot as plt
def parse_time(val):
val = val.replace(",", "")
return int(val) / 1e9
def parse_input():
matcher = re.compile(r"day(\d{2})::part(1|2) ... bench:(\s+)([0-9,]+) ns/iter \(\+/- ([0-9,]+)\)$")
results = np.zeros((25, 2, 2))
for line in sorted(fileinput.input()):
match = matcher.search(line)
assert match
day = int(match.group(1)) - 1
part = int(match.group(2)) - 1
time = parse_time(match.group(4))
variance = parse_time(match.group(5))
results[day, part, :] = [time, variance]
return results
def main():
results = parse_input()
_, ax = plt.subplots()
ax.set_yscale('log')
ax.set_xlabel('Day')
ax.set_ylabel('Runtime (s)')
ax.set_xticks(list(range(1, 26)))
bottom = np.min(results)
for i in range(results.shape[1]):
values = results[:, i, 0]
errors = results[:, i, 1]
pos = np.arange(len(values)) + 0.8 + 0.4 * i
ax.bar(pos, values, yerr=errors, align='center', width=0.4,
bottom=bottom)
ax.legend(['Part 1', 'Part 2'])
plt.savefig('runtime.svg')
if __name__ == '__main__':
main()