Я понимаю, что функция range()
, которая на самом деле тип объекта в Python 3, генерирует ее содержимое на лету, подобно генератору.
В этом случае я ожидал бы, что следующая строка займет слишком много времени, потому что для определения того, будет ли 1 квадриллион в диапазоне, необходимо создать квадратичные значения:
1000000000000000 in range(1000000000000001)
Кроме того: кажется, что независимо от того, сколько нулей я добавляю, расчет более или менее занимает одинаковое количество времени (в основном мгновенное).
Я также пробовал такие вещи, но расчет по-прежнему почти мгновен:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
Если я попытаюсь реализовать свою собственную функцию диапазона, результат не так хорош!!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
Что делает объект range()
, созданный под капотом, что делает его настолько быстрым?
Ответ Martijn Pieters был выбран за его полноту, но также см. ответить на первый ответ за хороший обсуждение того, что означает range
как полноценную последовательность в Python 3, и некоторую информацию/предупреждение о потенциальной несогласованности для оптимизации функций __contains__
в реализациях Python. abarnert other answer идет более подробно и содержит ссылки для тех, кто интересуется историей оптимизации в Python 3 (и отсутствием оптимизации xrange
в Python 2), Ответы poke и с помощью wim предоставляют соответствующий исходный код C и объяснения для тех, кто заинтересован.