Когда слишком умный код делает ваш код тупым
вступление
Я часто встречаю разработчиков, одержимых оптимизацией кода. Не поймите меня неправильно, оптимизация кода — благородное дело. Если все сделано правильно, программы могут работать быстрее, использовать меньше ресурсов и обеспечивать лучший пользовательский опыт в целом. Однако что мне действительно не нравится, так это когда код чрезмерно оптимизирован для спекулятивных сценариев, например: «Может быть, в какой-то момент мы перейдем на базу данных NoSQL». Такое мышление часто приводит к созданию кодовых баз, которые трудно понять и поддерживать — кошмар.
В погоне за идеально оптимизированной программой разработчики могут попасть в ряд ловушек. Эти ловушки не только затрудняют чтение и отладку кода, но и, как это ни парадоксально, могут ухудшить его производительность. От смертного греха преждевременной оптимизации до ошибочного внимания к микрооптимизации — многие из нас виновны в плохих практиках, которые мы скрываем под лозунгом «оптимизации».
В этой статье мы рассмотрим некоторые распространенные ошибки оптимизации кода, используя Python в качестве языка обсуждения. Цель состоит не только в том, чтобы определить, чего делать не следует, но и в том, чтобы предоставить сбалансированный взгляд на то, как разумно подходить к оптимизации. Мы рассмотрим примеры плохо оптимизированного кода, обсудим, почему они проблематичны, и представим более сбалансированные подходы к тем же проблемам.
Итак, давайте углубимся и разоблачим неуловимое искусство оптимизации кода, которое пошло не так.
Преждевременная оптимизация
Предположим, вам поручено суммировать элементы списка. Вместо использования встроенной функции Python sum
или простого цикла вы можете подумать: «Мне нужно, чтобы это было как можно быстрее!» и сразу переходим к слишком сложному методу.
Вот как вы можете реализовать сумму с преждевременной оптимизацией:
def super_fast_sum(lst): # Split the list into two halves middle = len(lst) // 2 first_half = lst[:middle] second_half = lst[middle:] # Use multithreading to sum each half import threading first_half_sum = [0] second_half_sum = [0] def sum_first_half(): first_half_sum[0] = sum(first_half) def sum_second_half(): second_half_sum[0] =…