Наскільки я розумію, що 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.Sequence
ABC.
bool
абоlong
тип, а для інших типів об'єкта він зійде з розуму. Спробуйте з:100000000000000.0 in range(1000000000000001)