Before starting to make timing comparisons, it's important to check that the optimized code is correct. It's no good being a hundred times faster if you get the wrong answer! So let's look at the results of the two functions on a simple test case:
>>> instructions = 'L1, L1, L1, L1, R1, R1, R1, R1'
>>> solve_set(instructions)
0.0
>>> solve_bisect(instructions)
1.0
Oops. It should have been clear that something was up, because any solution to this problem has to decode the instructions at least as far as the first intersection, and the only extra work that solve_set
does is to see if the point visited is a member of a set, and to add it if not, and these operations don't take much longer than decoding the instructions, so the most you could possibly save would be around 50%. If you saved 99% of the time, it can only be because you made a mistake and stopped too soon.