I went for a fast solution in part 1, which in retrospect I regret since the range and in approach of part2.py is easier to reason about and works for both parts.
Another regret: I used AoC for testing instead of writing actual tests. This cost me a five-minute timeout after I made too many submissions.
Something to research: There's probably something in Python builtins or stdlib which can make this one a really fast calculation.
Some optimizations I added to the Makefile today, it ultimately didn't contribute much performance though:
make t1 and make t2 to run tests for part 1 or 2, respectively.