What is the difference between range and xrange in Python
Introduction
This question is frequently asked on many technical websites. Before we clarify the key difference between the two, please note that xrange is a Python 2.x function. In other words, Python 2.x has both range and xrange. On the other hand, in Python 3.x there is only one function called range. So this question is only relevant to Python 2.x. In Python 3.x, the range function behaves like xrange in Python 2.x
Functionality
range and xrange are two builtin functions to generate a sequence of numbers. In the following examples, the output will be the same whether we use range or xrange…
1 2 3 4 5 6 7 8 9 |
# This prints 0, 1, 2, 3, 4 for i in range(5): print(i) # This prints 1, 2, 3, 4 for j in range(1, 5): print(j) # This prints 1, 3 for k in range(1, 5, 2): print(k) |
Differences
If both functions produce the same output, what is the difference then? In short, the only difference between the two is execution speed and memory size. xrange runs faster and better in terms of memory consumption. why is that the case ? xrange is implemented such that it does not return all elements at once, instead it generates them on demand. If you are curious, this is a separate topic in Python, you can check the following article for more information. To be more specific, the return type of range is a Python list while the return type of xrange is a generator object that can be called on demand.
Tips when to use what
- For compatible code between Python 2.x and 3.x, use only range
- To generate large sequences, use xrange
- If the sequence is not large and iterating over the list multiple times is needed, use range in this case
Summary
Here is a tabular summary…
range | xrange |
---|---|
Python 2.x and 3.x | Python 2.x only |
range in Python 2.x is not the same as range in Python 3.x | xrange in Python 2.x is the same as range in Python 3.x |
Generates a sequence of numbers using a list | Generates a sequence of numbers on demand using a generator object |
Good for small sequences and/or when iteration is repeated over and over the same list | Good for large sequences as it is faster and better memory management |
Returns a list object | Returns a generator object |
References