if i == middle - 1 or i >= 5 and len(list) <= 4:
return -1
Вот эта часть вызвает вопросы. Отладочный код остался?
Проблема в вашем коде, что он виснет, если числа в массиве вообще нет. Условие должно быть не про равенство, а про то, что у вас отрезок пуст (или длины 1) - надо сравнивать first и last.
Обычно middle не поддерживают между итерациями цикла, а просто считают внутри. Между итерациями переходят только first и last.
А так, да, бинпоиск - это весьма простой алгоритм.