1. 程式人生 > >python 中 range()和xrange()的區別

python 中 range()和xrange()的區別

先看看在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。