Или как писать эффективные циклы в коде

Проблема



Решение №1

Соедините петли!



Проблема SimAquarium
Проблема SimAquarium. GitHub Gist: мгновенно делитесь кодом, заметками и фрагментами.gist.github.com



Решение №2

Сохраните ссылку! (На самом деле не уверен, лучше это или хуже.)



Практическое объяснение

Представьте себе здание. Он имеет 16 этажей, и на каждом этаже есть 16 различных комнат. Теперь в каждой комнате есть 2 бумажки с написанным на них номером. Одна бумага синяя, а другая красная.

Представьте, что вы стоите снаружи здания, и ваш начальник дает вам ручку и бумагу. Он дает вам задание записать сумму чисел, написанных на всех синих листочках. Затем вы должны вернуться обратно снаружи и отчитаться о сумме.

Итак, вы приступили к выполнению задания. Вы входите в здание и идете в первую комнату. Находясь там, вы подходите к синей бумаге и записываете ее номер на своем листе бумаги. Затем вы переходите в следующую комнату, забыв о ее числах и следя только за суммой. В этой следующей комнате вы суммируете число из синей бумаги предыдущей комнаты с числом, написанным на синей бумаге в текущей комнате. Вы повторяете это для всех 16 комнат этого этажа. Затем вы переходите на следующий этаж и повторяете процесс до самой последней комнаты на самом верхнем этаже. Когда вы закончите, спуститесь по лестнице и покиньте здание.

Ваш босс рад услышать о ваших результатах! «Не могу дождаться, когда увижу сумму чисел, написанных на синих бумажках во всех комнатах здания!», — говорит он. Итак, вы передаете бумагу, а он улыбается! "Молодец! Я очень довольна вашей работой! Теперь, пожалуйста, сделайте то же самое еще раз, но на этот раз с красными листами».

Я уверен, что вы очень расстроены в этот момент. «Я ТОЛЬКО прошел целых 256 комнат 16-этажного дома, а теперь ты хочешь, чтобы я сделал это ЕЩЕ раз? Почему ты просто не сказал мне взглянуть на красные бумаги тоже, если я пройду буквально все красные бумаги ВСЕГДА?», — яростно кричите вы. у вашего босса.

Это веский аргумент. У вас было больше половины листа пустой бумаги для записи красных значений, поэтому было пустой тратой ресурсов (времени и энергии) не «воспользоваться моментом» и не записать красные значения. номера, когда вы бы передать их в любом случае.

Что ж, задание необходимо выполнить независимо от того, нравится вам это или нет, поэтому вы повторяете процесс и проходите все 256 комнат повторно.

Резюме

В итоге вы посетили 256 уникальных комнат, но вошли в комнаты здания в общей сложности 512 раз.

Поскольку в каждой комнате было 2 листа бумаги, но вы просматривали только по одному, вы использовали только половину бумаги в комнате за каждое посещение.

Каждый раз, выходя из комнаты, вы забываете о том, что в ней было. Все, что у вас осталось, это то, что вы собрали внутри, что в данном случае является суммой.

Было бы намного эффективнее записать количество ОБИХ бумаг во всех комнатах. Таким образом, вы получили бы все необходимые данные, и вам нужно было бы посетить каждую комнату только один раз.

Всякий раз, когда вы читаете или загружаете из памяти, у вас есть возможность получить из нее то, что вам нужно. Если вы переходите к следующей итерации цикла в этом случае, вы теряете ссылку на этот объект, и остается то, что вы извлекли из него. Так что, если вы не соберете достаточно данных во время цикла, вам придется перебрать их снова, а это означает, что все объекты будут считаны или загружены из памяти снова, что приведет к общему потребление памяти в два раза больше необходимого.

Подводя итог: для каждой комнаты в здании вы использовали только 50% ее вместимости, то есть вам приходилось тратить в 2 раза больше времени на получение всех чисел. Если бы в каждой комнате было по 3 бумаги, то вы бы использовали только 33% ее вместимости, что потребовало бы затрат в 3 раза больше времени на сбор всего, если бы все было сделано аналогичным образом.

Если вы все равно собираетесь зайти, убедитесь, что взяли все, что вам нужно, чтобы вам не пришлось возвращаться назад и снова брать кое-что. Это просто трата!

Лучше выполнить несколько быстрых задач в каждой комнате, а затем пройти необходимое расстояние по высоте до следующей комнаты один раз, чем делать выполнить одно быстроезадачу, а затем пройти необходимое расстояние над головой до следующей комнаты несколько раз.

Вы не едете в продуктовый магазин, чтобы купить молоко, затем едете домой и ставите его в холодильник, только чтобы вернуться в продуктовый магазин, чтобы купить хлопья, и вернуться домой. Нет, вы путешествуете один раз и покупаете все необходимое, пока вы там.

Ни у кого нет на это времени, как и у вашего компьютера при запуске вашего кода.

Будьте эффективны, кодируйте умно.