Циклы for и while, операторы break и continue, волшебное слово else

В этой статье я расскажу о циклах for и while, операторах break и continue, а также о слове else, которое, будучи употребленное с циклом, может сделать программный код несколько более понятным.
Цикл while
While — один из самых универсальных циклов в Python, поэтому довольно медленный. Выполняет тело цикла до тех пор, пока условие цикла истинно.
Цикл for уже чуточку сложнее, чуть менее универсальный, но выполняется гораздо быстрее цикла while. Этот цикл проходится по любому итерируемому объекту (например строке или списку), и во время каждого прохода выполняет тело цикла.
Оператор continue
Оператор continue начинает следующий проход цикла, минуя оставшееся тело цикла (for или while)
Оператор break
Оператор break досрочно прерывает цикл.
Слово else, примененное в цикле for или while, проверяет, был ли произведен выход из цикла инструкцией break, или же «естественным» образом. Блок инструкций внутри else выполнится только в том случае, если выход из цикла произошел без помощи break.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
while vs foreach vs for что быстрее в php
Один из самых важных и "узких" моментов, скорость работы массива. По массиву меню в процессе построения функции могут пробегать по многу раз, соответственно крайне важно чтоб этот момент работал на максимуме возможностей. давайте разберёмся всю ли правду пишут нам в интернете, какой массив работает быстрее while vs foreach vs for. Часть тестов не несут осмысленной нагрузки - ради интереса добавлены. Каждый тест перезапускался несколько раз.
Необходимо понимать, что тест имеет перекос в сторону обращения к двумерному массиву.
$a=array( 0=>array(0=>'top') ,1=>array(0=>'top') ,2=>array(0=>'top') ,3=>array(0=>'top') ,4=>array(0=>'top') ,5=>array(0=>'left') ,6=>array(0=>'left') ,7=>array(0=>'left') ,8=>array(0=>'left') ,9=>array(0=>'left') ); в функциях function f1() > 2. foreach($a as $k => $v) < if($v[0]=='right')<>> 3. for($i=0; $i > 4. $c=count($a); for($i=0; $i > 5. $c=count($a)-1; for($i=$c; $i>0; --$i) < if($a[$i][0]=='right')<>> 6. reset($a); while(list($k, $v) = each($a)) < if($v[0]=='right')<>> 7. reset($a); while(list(, $v) = each($a)) < if($v[0]=='right')<>> 8. $i=0; while($i++$i; > 9. $i=0; $c=count($a); while($i <$c)< if($a[$i][0]=='right')<>++$i; > 10. $i=count($a)-1; while($i>-1) < if($a[$i][0]=='right')<>--$i; > 11. $i=count($a)-1; while($i>=0) < if($a[$i][0]=='right')<>--$i; >
Результаты тестирования скорости массивов в PHP
| № | вызовов / функция | время | быстрее на | |
|---|---|---|---|---|
| 1 | 1 / foreach($a as $v) | 0.000018 | +0.000006 с. | +33.33 % |
| 2 | 1 / foreach($a as $k => $v) | 0.000012 | 0.000000 с. | 0 % |
| 3 | 1 / for($i=0; $i | 0.000036 | +0.000024 с. | +66.67 % |
| 4 | 1 / $c=count($a); for($i=0; $i | 0.000014 | +0.000002 с. | +14.29 % |
| 5 | 1 / $c=count($a)-1; for($i=$c; $i>0; --$i) | 0.000022 | +0.000010 с. | +45.45 % |
| 6 | 1 / reset($a); while(list($k, $v) = each($a)) | 0.000029 | +0.000017 с. | +58.62 % |
| 7 | 1 / reset($a); while(list(, $v) = each($a)) | 0.000035 | +0.000023 с. | +65.71 % |
| 8 | 1 / $i=0; while($i| 0.000028 |
+0.000016 с. |
+57.14 % |
|
| 9 | 1 / $i=0; $c=count($a); while($i<$c) | 0.000021 | +0.000009 с. | +42.86 % |
| 10 | 1 / $i=count($a)-1; while($i>-1) | 0.000013 | +0.000001 с. | +7.69 % |
| 11 | 1 / $i=count($a)-1; while($i>=0) | 0.000021 | +0.000009 с. | +42.86 % |
| № | вызовов / функция | время | быстрее на | |
|---|---|---|---|---|
| 1 | 1 / foreach($a as $v) | 0.000014 | +0.000005 с. | +35.71 % |
| 2 | 1 / foreach($a as $k => $v) | 0.000009 | 0.000000 с. | 0 % |
| 3 | 1 / for($i=0; $i | 0.000035 | +0.000026 с. | +74.29 % |
| 4 | 1 / $c=count($a); for($i=0; $i | 0.000012 | +0.000003 с. | +25 % |
| 5 | 1 / $c=count($a)-1; for($i=$c; $i>0; --$i) | 0.000020 | +0.000011 с. | +55 % |
| 6 | 1 / reset($a); while(list($k, $v) = each($a)) | 0.000023 | +0.000014 с. | +60.87 % |
| 7 | 1 / reset($a); while(list(, $v) = each($a)) | 0.000036 | +0.000027 с. | +75 % |
| 8 | 1 / $i=0; while($i| 0.000026 |
+0.000017 с. |
+65.38 % |
|
| 9 | 1 / $i=0; $c=count($a); while($i<$c) | 0.000021 | +0.000012 с. | +57.14 % |
| 10 | 1 / $i=count($a)-1; while($i>-1) | 0.000012 | +0.000003 с. | +25 % |
| 11 | 1 / $i=count($a)-1; while($i>=0) | 0.000023 | +0.000014 с. | +60.87 % |
В порядке возрастания
| № | вызовов / функция | время | быстрее на | |
|---|---|---|---|---|
| 2 | 1 / foreach($a as $k => $v) | 0.000012 | 0.000000 с. | 0 % |
| 10 | 1 / $i=count($a)-1; while($i>-1) | 0.000013 | +0.000001 с. | +7.69 % |
| 4 | 1 / $c=count($a); for($i=0; $i | 0.000014 | +0.000002 с. | +14.29 % |
| 1 | 1 / foreach($a as $v) | 0.000018 | +0.000006 с. | +33.33 % |
| 9 | 1 / $i=0; $c=count($a); while($i<$c) | 0.000021 | +0.000009 с. | +42.86 % |
| 11 | 1 / $i=count($a)-1; while($i>=0) | 0.000021 | +0.000009 с. | +42.86 % |
| 5 | 1 / $c=count($a)-1; for($i=$c; $i>0; --$i) | 0.000022 | +0.000010 с. | +45.45 % |
| 8 | 1 / $i=0; while($i| 0.000028 |
+0.000016 с. |
+57.14 % |
|
| 6 | 1 / reset($a); while(list($k, $v) = each($a)) | 0.000029 | +0.000017 с. | +58.62 % |
| 7 | 1 / reset($a); while(list(, $v) = each($a)) | 0.000035 | +0.000023 с. | +65.71 % |
| 3 | 1 / for($i=0; $i | 0.000036 | +0.000024 с. | +66.67 % |
| № | вызовов / функция | время | быстрее на | |
|---|---|---|---|---|
| 2 | 1 / foreach($a as $k => $v) | 0.000009 | 0.000000 с. | 0 % |
| 10 | 1 / $i=count($a)-1; while($i>-1) | 0.000012 | +0.000003 с. | +25 % |
| 4 | 1 / $c=count($a); for($i=0; $i | 0.000012 | +0.000003 с. | +25 % |
| 1 | 1 / foreach($a as $v) | 0.000014 | +0.000005 с. | +35.71 % |
| 5 | 1 / $c=count($a)-1; for($i=$c; $i>0; --$i) | 0.000020 | +0.000011 с. | +55 % |
| 9 | 1 / $i=0; $c=count($a); while($i<$c) | 0.000021 | +0.000012 с. | +57.14 % |
| 6 | 1 / reset($a); while(list($k, $v) = each($a)) | 0.000023 | +0.000014 с. | +60.87 % |
| 11 | 1 / $i=count($a)-1; while($i>=0) | 0.000023 | +0.000014 с. | +60.87 % |
| 8 | 1 / $i=0; while($i| 0.000026 |
+0.000017 с. |
+65.38 % |
|
| 3 | 1 / for($i=0; $i | 0.000035 | +0.000026 с. | +74.29 % |
| 7 | 1 / reset($a); while(list(, $v) = each($a)) | 0.000036 | +0.000027 с. | +75 % |
Выводы
- Неожиданно foreach показал хороший результат..
- Не все циклы в обратном порядке работают быстрей.
- Count внутри цикла работает медленнее, везде об этом пишут - вычисляется на каждом шагу значение.
- Любые конструкции где php приходиться самому додумывать, обрабатывать пропуски - медленнее, так и здесь while(list(, $v)
- Больше или равно работает медленнее нежели меньше, поэтому >-1 писать выгоднее нежели >=0 итп.
- foreach($a as $k=>$v) быстрее чем foreach($a as $v)
Много где пишут, что foreach медленнее остальных циклов, при этом тесты проводят только через foreach($a as $v). Отдельно в следующий раз протестирую что же быстрей for, while на каком-нить синтетическом тесте без обращения к массиву.
Меню раздела "Тесты производительности php"
Страница сгенерирована за 0.002783 сек.
На один процесс веб-сервера: 359 стр./сек.
Всего Apache может отдать: 91 904 стр./сек.
Выделено PHP памяти: 434.35 KB
(real_usage: 2 MB)
Браузер построил за сек.
Полное время сек.
С момента выгрузки предыдущей страницы
из памяти браузера: сек.
2. Цикл while
Двоеточие в конце строки с оператором while сообщает интерпретатору, что все последующие строки с отступом — блок команд (или тело цикла), которые нужно повторять.

Рис. \(1\). Пример \(4\)
Обрати внимание!
• При использовании цикла while важно правильно задать первое значение переменной — верно инициализировать.
• Переменная, значение которой проверяется в условии, должна изменяться в цикле, иначе мы можем получить бесконечный цикл, который никогда не завершится.
• Использование цикла while похоже на использование операторов ветвления, только условие в циклическом алгоритме проверяется несколько раз.
Интересно заметить, что любую программу с циклом for можно заменить на программу с циклом while. Проделаем это с примером \(1\).

Рис. \(2\). Пример \(5\)
А вот заменить программу с циклом while на программу с циклом for возможно не всегда. Почему же тогда не использовать только цикл while? Один из ответов — скорость выполнения. Цикл for работает быстрее. Посмотри на время выполнения примера \(1\) и примера \(5\).

Рис. \(3\). Пример \(5\) \((1)\)
С помощью встроенных модулей мы сравнили время, необходимое для вычисления всех значений квадратов циклом while — \(t1\), и время для вычисления тех же значений циклом for — \(t2\). Даже на таком коротком промежутке время вычислений циклом while на треть больше.
Циклы for и while, операторы break и continue, волшебное слово else

В этой статье будет сказано о циклах for и while, операторах break и continue, а также о слове else, которое, будучи употребленное с циклом, может сделать программный код несколько более понятным.
Цикл while
While — один из самых универсальных циклов в Python, поэтому довольно медленный. Выполняет тело цикла до тех пор, пока условие цикла истинно.
>>> i = 5 >>> while i < 15: . print(i) . i = i + 2 . 5 7 9 11 13
Цикл for
Цикл for уже чуточку сложнее, чуть менее универсальный, но выполняется гораздо быстрее цикла while. Этот цикл проходится по любому итерируемому объекту (например строке или списку), и во время каждого прохода выполняет тело цикла.
>>> for i in 'hello world': . print(i * 2, end='') . hheelllloo wwoorrlldd
Оператор continue
Оператор continue начинает следующий проход цикла, минуя оставшееся тело цикла (for или while)
>>> for i in 'hello world': . if i == 'o': . continue . print(i * 2, end='') . hheellll wwrrlldd
Оператор break
Оператор break досрочно прерывает цикл.
>>> for i in 'hello world': . if i == 'o': . break . print(i * 2, end='') . hheellll
Волшебное слово else
Слово else, примененное в цикле for или while, проверяет, был ли произведен выход из цикла инструкцией break, или же «естественным» образом. Блок инструкций внутри else выполнится только в том случае, если выход из цикла произошел без помощи break.
>>> for i in 'hello world': . if i == 'a': . break . else: . print('Буквы a в строке нет') . Буквы a в строке нет