Найти тему
Репетитор IT mentor

Разбираем циклы в Python на простых примерах. Какой цикл быстрее?

Оглавление
Название языка произошло вовсе не от названия семейства пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу 1970-х «Летающий цирк Монти Пайтона». Впрочем, всё равно название языка чаще связывают именно со змеёй, нежели с передачей — пиктограммы файлов в KDE или в Microsoft Windows и сам логотип языка изображает змеиные головы.
Название языка произошло вовсе не от названия семейства пресмыкающихся. Автор назвал язык в честь популярного британского комедийного телешоу 1970-х «Летающий цирк Монти Пайтона». Впрочем, всё равно название языка чаще связывают именно со змеёй, нежели с передачей — пиктограммы файлов в KDE или в Microsoft Windows и сам логотип языка изображает змеиные головы.

В Python есть два типа циклов: for и while. В отличие от многих си-подобных языков и от привычного многим Pascal, в Python нет аналога цикла do-while или repeat-until.

Разбираем цикл. Что такое арифметическая прогрессия?

Если простыми словами, то это упорядоченный по возрастанию или убыванию набор чисел, связанных одним правилом: любые два соседние числа отличаются на одну и ту же постоянную величину.

Более строгое определение:

-2

Теоретический пример формирования для вывода формулы общего k-го члена прогрессии:

-3

Как вывести общую формулу для суммы k первых членов арифметической прогрессии

1. Записываем сумму в общем виде
2. Расписываем каждый член, входящий в сумму, по формуле k-го члена
3. Записываем эту же сумму, но в обратной последовательности
4. Складываем последние два уравнения. Складывая левые части, получается 2S. Складывая правые части, получается k одинаковых выражений 2a1+(k-1)d, где каждое выражение получается путем сложения соответствующих слагаемых (выделено цветом)
5. Выражаем S

-4

Теперь, имея теоретические выкладки и формулы, которые можно проверить программированием, приступим к кодированию.

Пример цикла for

-5

Пример цикла while

-6

Вернемся к нашей задаче: подсчитать сумму первых N членов арифметической прогрессии. Сделаем через цикл и сделаем через выведенную ранее формулу.

Подсчет суммы через цикл и по теоретической формуле. Реализация средствами Python

-7

А если вы только начали изучать программирование и дошли до циклов, то предлагаю вам решить следующее задание для тренировки:

-8

Немного подумаем... а дальше будет решение...

-9

Итак, возможное решение:

Подсчет суммы ряда 1 + 1/2 + 1/3 +...
Подсчет суммы ряда 1 + 1/2 + 1/3 +...

Какой цикл работает быстрее? while или for ?

Ответы на вопросы об оптимизации не всегда однозначны. И в каждом конкретном случае лучше проверять самостоятельно. Здесь я предлагаю воспользоваться методом timeit() модуля timeit в Python.

-11

При каждом запуске время выполнение оказывается разным. Но в конкретной нашей программе цикл while работает быстрее, чем цикл for в 90% случаев.

Это интересно, потому что во многих статья в интернете пишут совсем другую информацию, что цикл while работает медленнее цикла for, что не выполнилось в нашем случае. Вопрос: почему?

Полный код программы: https://pastebin.com/Nb53ikSX

С помощью функции dis можно получить байткод Python и пронаблюдать интересную картину: на цикл while действительно приходится больше внутренних инструкций, чем на цикл for

-12

Посчитать количество инструкций тоже не панацея, и ответа на вопрос что быстрее в общем случае не даст. Потому что важно знать стоимость (время выполнения) каждой отдельной инструкции.

Какие варианты оптимизации кода можно попробовать:

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