[Python]range与xrange用法对比

时间:2022-03-12 23:29:20

【整理内容】具体如下:

先来看如下示例:
>>>x=xrange(0,8)
>>> print x
xrange(8)
>>>print x[0]
0
>>>print x[7]
7
>>>print x[8]
Traceback (most recent call last):File “”, line 1, in IndexError: xrange object index out of range
>>> x=range(0,8)
>>> print x
[0, 1, 2, 3, 4, 5, 6, 7]
>>> print x[0]
0
>>> print x[8]
Traceback (most recent call last):File “”, line 1, in IndexError: list index out of rangerange([start,] stop [,step])->list of integers


range(start, stop, step)返回一个递增或递减的数字列表,列表的元素值由三个参数决定:
start表示列表开始的值,可省,默认为“0”
stop表示列表结束的值,该参数不可缺少
参数step表示步长,可省,默认值为“1”
range返回的是一个列表,一次性计算并返回所有的值

xrange是一个类,返回的是一个生成器:
生成器是一个可迭代对象,在对生成器进行迭代时,元素是逐个被创建的
使用xrange()进行遍历,每次遍历只返回一个值
一般来看,在对大序列进行迭代的时候,因为xrange的特性,所以它会比较节约内存
因此,xrange的执行效率要高于range

首先,我们来看Python2里range()。它是一个内置函数,这个函数用于创建整数等差数列。因此它常被用于for循环。

从官方帮助文档,我们可以看出下面的特性:
1、内置函数(built-in)
2、接受3个参数分别是start, stop和step(其中start和step是可选的,stop是必需的)
3、如果没有指定start,默认从0开始(python都是从0开始的)
4、如果没有指定step,默认step是1。(step不能是0,如果指定step为0,“ValueError: range() step argument must not be zero”将会被抛出)

接下来看看xrange()。 xrange()虽然也是内置函数,但是它被定义成了Python里一种类型(type),这种类型就叫xrange。我们从Python 2的interactive shell里很容易看到这点。

我们从xragne的官方帮助文档可以看出:

xrange和range的参数和用法是相同的。只是xrange()返回的不再是一个数列,而是一个xrange对象。这个对象可以按需生成参数指定范围内的数字(即元素)。

由于xrange对象是按需生成单个的元素,而不像range那样,首先创建整个list。所以,在相同的范围内,xrange占用的内存空间将更小,xrange也会更快。

实际上,xrange由于是在循环内被调用时才会生成元素,因此无论循环多少次,只有当前一个元素占用了内存空间,且每次循环占用的都是相同的单个元素空间。

我们可以粗略的认为,相同n个元素的话,range占用的空间是xrange的n倍。因此,在循环很大情况下,xrange的高效率和快速将表现的很明显。


总结
1、range()返回整个list。
2、xrange()返回的是一个xrange object,且这个对象是个iterable。
3、两者都可用于for循环。
4、xrange()占用更少的内存空间,因为循环时xrange()只生成当前的元素,不像range()一开始就成生成完整的list。

这就是在Python 2里range和xrange的相同点和区别。

range()和xrange() 在Python 2里是两种不同的实现。但是在Python 3里,range()这种实现被移除了;保留了xrange()的实现,且将xrange()重新命名成range()。