1. 程式人生 > >range和xrange的比較

range和xrange的比較

Pythonrangexrange是不同的,兩者的區別是微妙的。為了簡單起見,這裡省略兩個函式的可選引數startsteprange返回值和想象的一樣:一個從0開始指定長度的連續整數序列。然而,xrange返回一個"xrange 物件",該物件非常類似於迭代器。如果你曾經研究過迭代器,則兩者的區別就很明顯。

下面是個例子:

range(1000000)

xrange(1000000)

range(1000000)會返回一個100萬的整數元素的序列,而xrange(1000000)在本質上會返回一個迭代序列。顯然xrange支援迭代,而range不支援。這種收益是很小的,因為"當需要元素的時候,xrange仍然要建立它們"。但是無論需要的序列多大,每次遍歷時

xrange消耗相同量的記憶體。在遍歷極端的大序列時,這是相對於range的很大優勢。另一個優勢也是明顯的:當你的程式碼在遍歷已經產生的序列時呼叫break的話, xrange顯然比range要好,因為xrange會消耗更少的記憶體。

這兩個基本上都是在迴圈的時候用。

for i inrange(0100):

print i

for i inxrange(0100):

print i

這兩個輸出的結果都是一樣的,實際上有很多不同,range會直接生成一個list物件:

a = range(0,100)

printtype(a)

print a

print a[0], a[1]

xrange

則不會直接生成一個list,而是每次呼叫返回其中的一個值

a = xrange(0,100)

printtype(a)

print a

print a[0], a[1]

示例:

[python] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. t1 = range(0100)  
  2. print type(t1)              # <type 'list'>
  3. print t1[0],t1[1],t1[99]    # 0 1 99
  4. print t1                    # [0, 1, 2, 3, 4, 5, 6, ..., 99]
  5. t2 = xrange(0
    100)    
  6. print type(t2)              # <type 'xrange'>
  7. print t2[0],t2[1],t2[99]    # 0 1 99
  8. print t2                    # xrange(100)

效能比較:

[python] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. ''''' 
  4. @author: homer 
  5. @see: ithomer.net 
  6. '''
  7. import time  
  8. def test_range(num):  
  9.     for i in range(0, num):  
  10.         #print i
  11.         pass
  12. def test_xrange(num):  
  13.     for i in xrange(0, num):  
  14.         #print i
  15.         pass
  16. NUM = 100000000
  17. # test range
  18. start = time.time()  
  19. test_range(NUM)  
  20. print("test_range() costTime: " + str(time.time() - start))  
  21. # test xrange
  22. start = time.time()  
  23. test_xrange(NUM)  
  24. 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吧,除非你是要返回一個列表。