range和xrange的比較
在Python中range和xrange是不同的,兩者的區別是微妙的。為了簡單起見,這裡省略兩個函式的可選引數start和step。range返回值和想象的一樣:一個從0開始指定長度的連續整數序列。然而,xrange返回一個"xrange 物件",該物件非常類似於迭代器。如果你曾經研究過迭代器,則兩者的區別就很明顯。
下面是個例子:
range(1000000)
xrange(1000000)
range(1000000)會返回一個100萬的整數元素的序列,而xrange(1000000)在本質上會返回一個迭代序列。顯然xrange支援迭代,而range不支援。這種收益是很小的,因為"當需要元素的時候,xrange仍然要建立它們"。但是無論需要的序列多大,每次遍歷時
這兩個基本上都是在迴圈的時候用。
for i inrange(0, 100):
print i
for i inxrange(0, 100):
print i
這兩個輸出的結果都是一樣的,實際上有很多不同,range會直接生成一個list物件:
a = range(0,100)
printtype(a)
print a
print a[0], a[1]
而xrange
a = xrange(0,100)
printtype(a)
print a
print a[0], a[1]
示例:
[python] view plaincopyprint?- t1 = range(0, 100)
- print type(t1) # <type 'list'>
- print t1[0],t1[1],t1[99] # 0 1 99
- print t1 # [0, 1, 2, 3, 4, 5, 6, ..., 99]
-
t2 = xrange(0
- print type(t2) # <type 'xrange'>
- print t2[0],t2[1],t2[99] # 0 1 99
- print t2 # xrange(100)
效能比較:
[python] view plaincopyprint?- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- '''''
- @author: homer
- @see: ithomer.net
- '''
- import time
- def test_range(num):
- for i in range(0, num):
- #print i
- pass
- def test_xrange(num):
- for i in xrange(0, num):
- #print i
- pass
- NUM = 100000000
- # test range
- start = time.time()
- test_range(NUM)
- print("test_range() costTime: " + str(time.time() - start))
- # test xrange
- start = time.time()
- test_xrange(NUM)
- print("test_xrange() costTime: " + str(time.time() - start))
NUM = 100000000
test_range() costTime: 18.8114709854
test_xrange() costTime: 1.08277893066
NUM = 1000000
test_range() costTime: 0.0496039390564
test_xrange() costTime: 0.0162799358368
NUM = 10000
test_range() costTime: 0.000231027603149
test_xrange() costTime: 0.000118970870972
所以xrange做迴圈的效能比range好,尤其是返回很大的時候!
儘量用xrange吧,除非你是要返回一個列表。