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.