Иногда программистам, особенно начинающим, трудно понять, почему операция проверки принадлежности числа к диапазону, созданному с помощью функции range()
, выполняется так быстро в Python 3.
В качестве примера можно привести следующий код:
1000000000000000 in range(1000000000000001)
На первый взгляд, кажется, что для проверки принадлежности числа к диапазону, Python должен сгенерировать все числа в этом диапазоне, что, безусловно, потребует значительного времени. Однако, на практике эта операция выполняется практически мгновенно, даже когда диапазон содержит квадриллион чисел.
Такая быстрота работы обусловлена спецификой работы функции range()
в Python 3. В отличие от Python 2, где range()
создавала список, в Python 3 range()
создает неизменяемый последовательный тип, который генерирует числа «на лету», т.е. по мере необходимости, экономя память.
Но самое главное, что объекты range()
в Python 3 имеют оптимизированную реализацию операции in
, которая проверяет принадлежность элемента к диапазону. Вместо того чтобы проходить по всему диапазону, Python просто проверяет, находится ли число между начальным и конечным значением диапазона и делится ли разница между проверяемым числом и начальным значением диапазона без остатка на шаг диапазона. Эта проверка выполняется мгновенно, вне зависимости от размера диапазона.
Таким образом, особенности реализации функции range()
в Python 3 позволяют выполнять операции проверки принадлежности числа к диапазону очень быстро, что делает Python еще более эффективным инструментом для программистов.
Добавить комментарий