Наскільки я розумію, що 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()об'єкт робить під кришкою, що робить це так швидко?
Відповідь Мартіна Пітерса була обрана для її повноти, але також див . Першу відповідь abarnert для гарного обговорення того, що означає rangeбути повноцінною послідовністю в Python 3, а також деяку інформацію / попередження щодо потенційної невідповідності __contains__оптимізації функцій у всіх реалізаціях Python . Інша відповідь abarnert детальніше описується та надає посилання тим, хто цікавиться історією оптимізації в Python 3 (та відсутністю оптимізації xrangeв Python 2). Відповіді poke та wim надають відповідний вихідний код C та пояснення тим, хто цікавиться.
rangeце генератор?
xrangeтакий самий, як Python3range ?
xrange()Об'єкти @Superbest не мають __contains__методу, тому перевірка елементів повинна пройти крізь усі елементи. Плюс є мало інших змін range(), наприклад, він підтримує нарізку (що знову повертає rangeоб’єкт), а тепер також є countі indexметоди, щоб зробити його сумісним з collections.SequenceABC.
boolабоlongтип, а для інших типів об'єкта він зійде з розуму. Спробуйте з:100000000000000.0 in range(1000000000000001)