It is my understanding that the range()
function, which is actually an object type in Python 3, generates its contents on the fly, similar to a generator.
This being the case, I would have expected the following line to take an inordinate amount of time because, in order to determine whether 1 quadrillion is in the range, a quadrillion values would have to be generated:
1000000000000000 in range(1000000000000001)
Furthermore: it seems that no matter how many zeroes I add on, the calculation more or less takes the same amount of time (basically instantaneous).
I have also tried things like this, but the calculation is still almost instant:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
If I try to implement my own range function, the result is not so nice!!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
What is the range()
object doing under the hood that makes it so fast?
Martijn Pieters' answer was chosen for its completeness, but also see abarnert's first answer for a good discussion of what it means for range
to be a full-fledged sequence in Python 3, and some information/warning regarding potential inconsistency for __contains__
function optimization across Python implementations. abarnert's other answer goes into some more detail and provides links for those interested in the history behind the optimization in Python 3 (and lack of optimization of xrange
in Python 2). Answers by poke and by wim provide the relevant C source code and explanations for those who are interested.
bool
orlong
type, with other object types it will go crazy. Try with:100000000000000.0 in range(1000000000000001)
– Ashwini Chaudhary__contains__
method. – abarnertxrange
the same as Python3range
? – Superbestxrange()
objects have no__contains__
method, so the item check has to loop through all the items. Plus there are few other changes inrange()
, like it supports slicing(which again returns arange
object) and now also hascount
andindex
methods to make it compatible withcollections.Sequence
ABC. – Ashwini Chaudharyrange.__contains__
method implemented in pure Python – jfs