Соответствующий контекст объясняется в этой теме.
Короче говоря, range(100000000)
создает огромный список в Python 2, тогда как с помощью вложенных циклов вы строите списки только с 1000 + 1000 + 100 = 2100 элементов. В Python 3 range
умнее и ленивее, как xrange
в Python 2.
Вот некоторые моменты времени для следующего кода. Абсолютное время выполнения зависит от системы, но сравнение значений друг с другом является ценным.
import timeit
runs = 100
code = '''k = 0
for i in range(1000):
for j in range(1000):
for l in range(100):
k += 1'''
print(timeit.timeit(stmt=code, number=runs))
code = '''k = 0
for i in range(100000000):
k += 1'''
print(timeit.timeit(stmt=code, number=runs))
Выходы:
CPython 2.7 - range
264.650791883
372.886064053
Интерпретация: создание огромных списков требует времени.
CPython 2.7 - range
заменяется на xrange
231.975350142
221.832423925
Интерпретация: почти равная, как и ожидалось. (Вложенные for
петли должны иметь слегка
большие накладные расходы, чем один for
цикл.)
CPython 3.6 - range
365.20924194483086
437.26447860104963
Интерпретация: Интересно! Я не ожидал этого. Кто-нибудь?