Найти в Дзене
Репетитор 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

Что-то пошло не так, и нам не удалось загрузить комментарии. Попробуйте ещё раз
Рекомендуем почитать
🐍🏗️ Основы архитектуры для джунов: построение масштабируемых и чистых приложений на Python
Когда речь идет о создании масштабируемых и поддерживаемых приложений, понимание таких важных понятий, как принципы чистого кода, архитектурные паттерны и SOLID практики проектирования, имеет решающее значение. Изучив эти принципы, новички получат представление о построении надежных, гибких и легко тестируемых приложений, что позволит им сохранить ясность кодовой базы и возможность ее сопровождения по мере роста их проектов. Немного теории Прежде чем погрузиться в архитектуру, я хотел бы ответить...
🐍📋 F-строки в Python для интерполяции и форматирования строк
Из этой статьи вы узнаете, как использовать f-строки — инструмент для быстрой интерполяции и форматирования строк, который превосходит по эффективности и читабельности классические подходы с применением оператора % и метода .format(). Данная статья является переводом. Ссылка на оригинал. К концу этого руководства вы поймете, почему f-строки – это мощный инструмент, которым необходимо овладеть разработчику на Python. В этом самоучителе вы узнаете, как: Для извлечения максимальной пользы от этого руководства, вы должны быть знакомы с типом данных строк Python...
Кто придумал язык Python? И почему такое название?
Язык программирования Python был создан Гвидо ван Россумом (Guido van Rossum) в конце 1980-х — начале 1990-х годов. Гвидо начал разработку Python в декабре 1989 года, когда работал в Центре математики и информатики (CWI) в Нидерландах. Первая версия Python была выпущена в 1991 году. Подписывайтесь на мой канал в Телеграмм, чтобы ничего не пропустить. Название Python не связано со змеёй, как могут подумать многие. Гвидо ван Россум был большим поклонником британского комедийного шоу "Monty Python's Flying Circus" ("Летающий цирк Монти Пайтона"), которое шло на BBC в 1970-х годах...
Следующая статья
Документы, вакансии и контакты