A binary search solution to 3Sum
Your bi_search() method is recursive.  It doesn’t have to be.  Python does not do tail-call-optimization: it won’t automatically turn the recursion into a loop.  Instead of if len(L) &lt; 1:, use a while len(L) &gt; 0: loop, and assign to (eg, L = L[:mid]) instead of doing a recursive call. 

Better: don’t modify L at all, which involves copying a list of many numbers multiple times, a time consuming operation.  Instead, maintain a lo and hi index, and just update the indexes as you search. 

Even better: use a built in binary search from import bisect.