В Python есть два типа циклов: for и while. В отличие от многих си-подобных языков и от привычного многим Pascal, в Python нет аналога цикла do-while или repeat-until.
Разбираем цикл. Что такое арифметическая прогрессия?
Если простыми словами, то это упорядоченный по возрастанию или убыванию набор чисел, связанных одним правилом: любые два соседние числа отличаются на одну и ту же постоянную величину.
Более строгое определение:
Теоретический пример формирования для вывода формулы общего k-го члена прогрессии:
Как вывести общую формулу для суммы k первых членов арифметической прогрессии
1. Записываем сумму в общем виде
2. Расписываем каждый член, входящий в сумму, по формуле k-го члена
3. Записываем эту же сумму, но в обратной последовательности
4. Складываем последние два уравнения. Складывая левые части, получается 2S. Складывая правые части, получается k одинаковых выражений 2a1+(k-1)d, где каждое выражение получается путем сложения соответствующих слагаемых (выделено цветом)
5. Выражаем S
Теперь, имея теоретические выкладки и формулы, которые можно проверить программированием, приступим к кодированию.
Пример цикла for
Пример цикла while
Вернемся к нашей задаче: подсчитать сумму первых N членов арифметической прогрессии. Сделаем через цикл и сделаем через выведенную ранее формулу.
Подсчет суммы через цикл и по теоретической формуле. Реализация средствами Python
А если вы только начали изучать программирование и дошли до циклов, то предлагаю вам решить следующее задание для тренировки:
Немного подумаем... а дальше будет решение...
Итак, возможное решение:
Какой цикл работает быстрее? while или for ?
Ответы на вопросы об оптимизации не всегда однозначны. И в каждом конкретном случае лучше проверять самостоятельно. Здесь я предлагаю воспользоваться методом timeit() модуля timeit в Python.
При каждом запуске время выполнение оказывается разным. Но в конкретной нашей программе цикл while работает быстрее, чем цикл for в 90% случаев.
Это интересно, потому что во многих статья в интернете пишут совсем другую информацию, что цикл while работает медленнее цикла for, что не выполнилось в нашем случае. Вопрос: почему?
Полный код программы: https://pastebin.com/Nb53ikSX
С помощью функции dis можно получить байткод Python и пронаблюдать интересную картину: на цикл while действительно приходится больше внутренних инструкций, чем на цикл for
Посчитать количество инструкций тоже не панацея, и ответа на вопрос что быстрее в общем случае не даст. Потому что важно знать стоимость (время выполнения) каждой отдельной инструкции.
Какие варианты оптимизации кода можно попробовать:
1. Добиться правильной и безотказной работы программы и оставить всё как есть
2. Не знаете Assembler или нет времени с ним разобраться, тогда можно просто на практике попробовать несколько вариантов реализации кода, измерить их время и выбрать то, что быстрее всего. Например, некоторые вещи из библиотеки NumPy будут работать быстрее, чем нативная реализация на Python
3. Cкорость важна и любой ценой нужно её повысить максимально. Рассмотреть все возможные варианты, включая библиотеки. Или попробовать оптимизацию с переписыванием кода на C или Cython.
4. Не хватает производительности. Задуматься о переходе на компилируемый язык программирования.
Информация по теме:
Функция timeit() модуля timeit в Python
dis — Disassembler for Python bytecode
Еще много полезного:
Библиотека с книгами для физиков, математиков и программистов
Репетитор IT mentor в VK // Репетитор IT mentor в Instagram
Репетитор IT mentor в Яндекс.Дзен // Репетитор IT mentor в telegram