python 中 range()和xrange()的区别

时间:2022-03-12 23:29:14
先看看在python 2.x中这两个函数的区别:

先看函数range()的官方帮助文档:
$ python
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> help(range)


Help on built-in function range in module __builtin__:

range(...)
    range([start,] stop[, step]) -> list of integers
    
    Return a list containing an arithmetic progression of integers.
    range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
    When step is given, it specifies the increment (or decrement).
    For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
    These are exactly the valid indices for a list of 4 elements.
(END) 

从官方帮助文档可以知道:
1,range是内置函数(built-in);
2,接受三个参数start,stop和step,其中start,step可以忽略,stop必须有;
3,函数返回一个整数list (list of integers);
4, range(i, j) returns [i, i+1, i+2, ..., j-1];
5, range(4) returns [0, 1, 2, 3]

再看xrange()的官方帮助文档:
$ python
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> help(xrange)
Help on class xrange in module __builtin__:

class xrange(object)
 |  xrange([start,] stop[, step]) -> xrange object
 |  
 |  Like range(), but instead of returning a list, returns an object that
 |  generates the numbers in the range on demand.  For looping, this is 
 |  slightly faster than range() and more memory efficient.
 |  
 |  Methods defined here:
 |  
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |  
 |  __getitem__(...)
 |      x.__getitem__(y) <==> x[y]
 |  
 |  __iter__(...)
 |      x.__iter__() <==> iter(x)
 |  
 |  __len__(...)
 |      x.__len__() <==> len(x)
 |  
 |  __reduce__(...)
 |  
 |  __repr__(...)
 |      x.__repr__() <==> repr(x)
 |  
 |  __reversed__(...)
 |      Returns a reverse iterator.
 |  
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __new__ = <built-in method __new__ of type object>
 |      T.__new__(S, ...) -> a new object with type S, a subtype of T
(END) 

从官方帮助文档可以知道:
1,xrange也是一个内置函数(built-in);
2,xrange和range参数用法相同;
2,返回的是一个xrange 对象即xrange object, 而range返回list;
3,xrange比range运行的更快,而且更节省内存空间;

结论:
1,xrange和range功能相同
2,xrange和range实现方式不同:
range函数返回一个list
xrange函数返回一个迭代器
3,建议使用xrange,特别是在循环很大的情况下

xrange比range要快,要节省内存,它是如何实现的?
range返回一个list,而xrange返回一个迭代器,
即若循环是100,则range返回一个list,里面有100个整数,
而xrange只有在循环内被调用时才会产生一个整数,所以无论循环多少次,当前只用一个
元素,也就是只用了一个整数的内存空间,所以,在循环很大情况下,xrange的效率和速度比range很明显。

=======================================================
在python 3.x中它们有什么区别呢?
在python 3.x中range函数被删除了,xrange函数被重命名成了range。
所以在python 3.x中range 和 xrange 虽然名字不同,可是最终都是使用的xrange。