use python's own timeit module instead of our own halfbaked implementation

This commit is contained in:
Stefan Harmuth 2020-12-07 11:00:58 +01:00
parent 8eecddaf60
commit bc64ff468d
9 changed files with 35 additions and 25 deletions

View File

@ -1,13 +1,11 @@
import time import time
def print_execution_time(func): def print_execution_time(day, part, avg_time):
def wrapper(*args, **kwargs): units = ['s', 'ms', 'μs', 'ns']
time_start = time.time() unit = 0
return_value = func(*args, **kwargs) while avg_time < 1:
time_stop = time.time() avg_time *= 1000
print('{:s} function took {:.3f}ms'.format(func.__name__, (time_stop - time_start) * 1000.0)) unit += 1
return return_value print("Average execution time for day %s part %s: %1.2f%s" % (day, part, avg_time, units[unit]))
return wrapper

View File

@ -18,13 +18,11 @@ def getProductOf2020Sum(input_lines, combinations):
return return_value return return_value
@aoclib.print_execution_time
def part1(test_mode=False): def part1(test_mode=False):
my_input = aoclib.getInputAsArray(day=DAY, return_type=int, test=test_mode) my_input = aoclib.getInputAsArray(day=DAY, return_type=int, test=test_mode)
return getProductOf2020Sum(my_input, 2) return getProductOf2020Sum(my_input, 2)
@aoclib.print_execution_time
def part2(test_mode=False): def part2(test_mode=False):
my_input = aoclib.getInputAsArray(day=DAY, return_type=int, test=test_mode) my_input = aoclib.getInputAsArray(day=DAY, return_type=int, test=test_mode)
return getProductOf2020Sum(my_input, 3) return getProductOf2020Sum(my_input, 3)

View File

@ -7,7 +7,6 @@ TEST_SOLUTION_PART2 = 1
splitter = re.compile(r'([0-9]+)-([0-9]+) ([a-z]): (.*)') splitter = re.compile(r'([0-9]+)-([0-9]+) ([a-z]): (.*)')
@aoclib.print_execution_time
def part1(test_mode=False): def part1(test_mode=False):
my_input = aoclib.getInputAsArray(day=2, test=test_mode) my_input = aoclib.getInputAsArray(day=2, test=test_mode)
valid_count = 0 valid_count = 0
@ -20,7 +19,6 @@ def part1(test_mode=False):
return valid_count return valid_count
@aoclib.print_execution_time
def part2(test_mode=False): def part2(test_mode=False):
my_input = aoclib.getInputAsArray(day=2, test=test_mode) my_input = aoclib.getInputAsArray(day=2, test=test_mode)
valid_count = 0 valid_count = 0

View File

@ -20,13 +20,11 @@ def check_for_trees(right_step, down_step, treelines):
return tree_count return tree_count
@aoclib.print_execution_time
def part1(test_mode=False): def part1(test_mode=False):
my_input = aoclib.getInputAsArray(day=3, test=test_mode) my_input = aoclib.getInputAsArray(day=3, test=test_mode)
return check_for_trees(3, 1, my_input) return check_for_trees(3, 1, my_input)
@aoclib.print_execution_time
def part2(test_mode=False): def part2(test_mode=False):
my_input = aoclib.getInputAsArray(day=3, test=test_mode) my_input = aoclib.getInputAsArray(day=3, test=test_mode)
tree_count1 = check_for_trees(1, 1, my_input) tree_count1 = check_for_trees(1, 1, my_input)

View File

@ -71,7 +71,6 @@ def verifyPassportData(passport_data, verify_data=False):
return True return True
@aoclib.print_execution_time
def part1(test_mode=False): def part1(test_mode=False):
valid = 0 valid = 0
for passport_line in aoclib.getMultiLineInputAsArray(day=4, join_char=" ", test=test_mode): for passport_line in aoclib.getMultiLineInputAsArray(day=4, join_char=" ", test=test_mode):
@ -82,7 +81,6 @@ def part1(test_mode=False):
return valid return valid
@aoclib.print_execution_time
def part2(test_mode=False): def part2(test_mode=False):
valid = 0 valid = 0
for passport_line in aoclib.getMultiLineInputAsArray(day=4, join_char=" ", test=test_mode): for passport_line in aoclib.getMultiLineInputAsArray(day=4, join_char=" ", test=test_mode):

View File

@ -44,7 +44,6 @@ def getSeatID(row, column):
return row * 8 + column return row * 8 + column
@aoclib.print_execution_time
def part1(test_mode=False): def part1(test_mode=False):
my_input = aoclib.getInputAsArray(day=5, test=test_mode) my_input = aoclib.getInputAsArray(day=5, test=test_mode)
max_id = 0 max_id = 0
@ -55,7 +54,6 @@ def part1(test_mode=False):
return max_id return max_id
@aoclib.print_execution_time
def part2(test_mode=False): def part2(test_mode=False):
my_input = aoclib.getInputAsArray(day=5, test=test_mode) my_input = aoclib.getInputAsArray(day=5, test=test_mode)
seat_list = list(range(0, 1024)) seat_list = list(range(0, 1024))

View File

@ -14,7 +14,6 @@ def getAnswerCount(answer_line):
return return_dict return return_dict
@aoclib.print_execution_time
def part1(test_mode=False): def part1(test_mode=False):
my_input = aoclib.getMultiLineInputAsArray(day=DAY, test=test_mode) my_input = aoclib.getMultiLineInputAsArray(day=DAY, test=test_mode)
yes_count = 0 yes_count = 0
@ -25,7 +24,6 @@ def part1(test_mode=False):
return yes_count return yes_count
@aoclib.print_execution_time
def part2(test_mode=False): def part2(test_mode=False):
my_input = aoclib.getMultiLineInputAsArray(day=DAY, test=test_mode) my_input = aoclib.getMultiLineInputAsArray(day=DAY, test=test_mode)

View File

@ -55,7 +55,6 @@ def getBagContentCount(color_dict, my_color):
return count return count
@aoclib.print_execution_time
def part1(test_mode=False): def part1(test_mode=False):
my_input = aoclib.getInputAsArray(day=DAY, test=test_mode) my_input = aoclib.getInputAsArray(day=DAY, test=test_mode)
possible_bags = {} possible_bags = {}
@ -71,7 +70,6 @@ def part1(test_mode=False):
return len(getPossibleBagsForMyColor(possible_bags, MY_BAG)) return len(getPossibleBagsForMyColor(possible_bags, MY_BAG))
@aoclib.print_execution_time
def part2(test_mode=False): def part2(test_mode=False):
my_input = aoclib.getInputAsArray(day=DAY, test=test_mode) my_input = aoclib.getInputAsArray(day=DAY, test=test_mode)
big_content_dict = {} big_content_dict = {}

26
main.py
View File

@ -4,11 +4,21 @@ import argparse
import aoclib import aoclib
import importlib import importlib
import os import os
import timeit
TIMEIT_NUMBER = 50
argument_parser = argparse.ArgumentParser() argument_parser = argparse.ArgumentParser()
argument_parser.add_argument("-d", "--day", help="specify day to process; leave empty for ALL days", type=int) argument_parser.add_argument("-d", "--day", help="specify day to process; leave empty for ALL days", type=int)
argument_parser.add_argument("-t", "--test", help="run test cases", action="store_true", default=False) argument_parser.add_argument("-t", "--test", help="run test cases", action="store_true", default=False)
argument_parser.add_argument("-p", "--part", help="run only part x", choices=[1, 2], type=int) argument_parser.add_argument("-p", "--part", help="run only part x", choices=[1, 2], type=int)
argument_parser.add_argument("--timeit", help="measure execution time", action="store_true", default=False)
argument_parser.add_argument(
"--timeit-number",
help="build average time over this many executions",
type=int,
default=TIMEIT_NUMBER
)
flags = argument_parser.parse_args() flags = argument_parser.parse_args()
import_day = "" import_day = ""
@ -47,7 +57,23 @@ for lib in sorted(imported):
) )
if not flags.part or flags.part == 1: if not flags.part or flags.part == 1:
if not flags.timeit:
aoclib.printSolution(day, 1, globals()[lib].part1(test_mode=flags.test), test=flags.test) aoclib.printSolution(day, 1, globals()[lib].part1(test_mode=flags.test), test=flags.test)
else:
exec_time = timeit.timeit(
'globals()[lib].part1(test_mode=flags.test)',
globals=globals(),
number=flags.timeit_number
) / flags.timeit_number
aoclib.print_execution_time(day, 1, exec_time)
if not flags.part or flags.part == 2: if not flags.part or flags.part == 2:
if not flags.timeit:
aoclib.printSolution(day, 2, globals()[lib].part2(test_mode=flags.test), test=flags.test) aoclib.printSolution(day, 2, globals()[lib].part2(test_mode=flags.test), test=flags.test)
else:
exec_time = timeit.timeit(
'globals()[lib].part2(test_mode=flags.test)',
globals=globals(),
number=flags.timeit_number
) / flags.timeit_number
aoclib.print_execution_time(day, 2, exec_time)