python 中 range()和xrange()的區別
阿新 • • 發佈:2019-02-12
先看看在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。
先看函式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。