In Python, Both range() and xrange() functions produce the integer numbers between a given start value and stop value. **So What is the difference between range() and xrange() functions? ** Let’s check it out.

Recommended Exercise and Quiz:

**Further Reading**: **Python Basics (9 Article)**

## Python xrange() and range() function

In **Python 2** we have the following two functions to produce a list of numbers within a given range.

**range**()**xrange**()

*in Python 3, ***xrange() is deprecated**, i.e. xrange() is removed from python 3.x.

But, range() function of python 3 works same as `xrange()`

of python 2 (i.e. internal implementation of `range()`

function of python 3 is same as `xrange()`

of Python 2).

So The **difference **between ** range()** and

**functions**

`xrange()`

**becomes relevant only when you are using python 2.**

## Difference between range() and xrange() functions in Python

There are many differences between these two functions concerning performance, memory, speed and internal implementation. Both implemented in different ways. Let see this one by one.

### range() and xrange() Functionality

In terms of functionality both range() and xrange() functions generates integer numbers within given range. i.e,. `range (1,5,1)`

will produce [1,2,3,4] and `xrange(1,5,1)`

will produce` [1,2,3,4]`

. So no difference in terms of functionality between `range()`

and `xrange()`

.

### range() and xrange() return value

**range() creates a list**i.e., range returns a Python list object, for example,`range (1,500,1)`

will create a python list of 499 integers in memory. Remember,**range() generates all numbers at once**.**xrange() functions returns an xrange object**that evaluates lazily. That means xrange only stores the range arguments and generates the numbers on demand. It doesn’t generate all numbers at once like range(). Furthermore, this object only supports indexing, iteration, and the`len()`

function.

On the other hand **xrange() generates the numbers on demand**. That means it produces number one by one as for loop moves to the next number. In every iteration of for loop, it generates the next number and assigns it to the iterator variable of for loop.

### range() and xrange() return type

- range() return type is Python list.
- xrange() function returns xrange object.

**Printing return type of range() function:**

range_numbers = range(2,10,2) print ("The return type of range() is : ") print (type(range_numbers ))

**Output**: Run Online

The return type of range() is : <type 'list'>

**Printing return type of xrange() function:**

xrange_numbers = xrange(1,10,1) print "The return type of xrange() is : " print type(xrange_numbers )

**Output**: Run Online

The return type of xrange() is : <type 'xrange'>

### range() vs xrange() performance and speed test

We tested the speed of both the functions with a `timeit`

module to test which code is faster. Let’s see the result. **In our speed test, we found xrange() is faster than range.**

#### Speed test with Python range() function

$ python -m timeit 'for num in range(1000000):' ' pass'

We executed the above loop **5** times and found that the average time per loop with range() is **92.8** millisecond. **Speed test with Python xrange() function**

python -m timeit 'for i in xrange(1000000):' ' pass'

We executed the above loop **5** times and found the average time per loop with xrange() is **52.3** millisecond. So it’s clear now **xrange is faster and saves memory**.

- As you know,
`xrange`

doesn’t generate a static list at run-time as the range does. xrange() creates the values on-demand as you need them using a technique called**yielding**. - The
`range ()`

function produced all numbers instantaneously before the for loop started executing.

The main problem with the original `range()`

function is it uses a considerable amount of memory if you are producing a vast range of numbers.

`xrange()`

function always produces the next number on the fly, i.e. only keeps one number in memory at a time to consume less memory.

## Should we always favor xrange over a range()

The advantage of the xrange function is it always takes the same amount of memory, no matter the size of the range it represents. There are consistent performance advantages. Let see the scenarios where we can use range and xrange.

### Scenarios where we can use xrange() function

**If you are dealing with an extensive range of numbers, then I recommend you to use xrange()**, i.e. you should always favor xrange() over a range() if we want to generate the vast range of numbers.- xrange() is very helpful if your system has less memory like cell phones. Using xrange(), you can prevent memory overflow errors.
- As xrange() resolves each number lazily, if you stop iteration early, you won’t waste time creating the whole list.

### Scenarios where we should use range() function

**If you want to iterate over the list multiple times**, then I recommend you to use range(). Because xrange has to generate an integer object whenever we access an index, this can overhead.- If you need to generate fewer numbers, then go for
`range()`

function. - The
`range ()`

returns the list so that you can use all list operations on it. On the other hand, you know xrange() returns the xrange object, so you can’t use all list operations on it. **Compatibility of code**– If you want to write code that must run on both Python 2 and Python 3, use`range()`

as the xrange function removed from Python 3.

### Python xrange() not defined error

You will get a “python xrange not defined” error if you try to use xrange() in Python 3, xrange() is removed from Python 3. If you try to import xrange() function in Python, you encountered an error. You will get this error NameError: global name ‘xrange’ is not defined in Python 3. better to use range().

## Next Steps

To practice what you learned in this article, I have created a Python Basic Quiz and Exercise.

**Solve our Free Python essential exercise for beginners**. This Exercise will help you to have a better understanding of Python’s basic concepts.- Also, Solve our
**Basic Python Quiz for beginners**to test your fundamental Python skills.

Let me know your comments and feedback in the section below.