在python2中,range函數返回一個列表對象,一次性把全部的元素加載到內存中,因此有時會感受系統卡頓。python
xrange和python3中的range函數相似,都是返回一個迭代器對象。在取數很大的時候執行結果相差懸殊。函數
緣由:spa
python文檔 in 的規則:code
若是該類實現了__contains__() 方法,那麼只要 y.__contains__(x) 返回 true,那麼,x in y 也返回true,反之亦然。 沒有實現__contains__() 方法,但實現了__iter__()方法,那麼在迭代過程當中若是有某個值z == x,就返回true, 不然就是false。 若是兩個方法都沒實現,就看 __getitem__()方法,若是存在一個索引 i 使得 x ==y[i], 就返回true ,不然返回 false
xrange 提供方法對象
dir(xrange) ['__class__','__getitem__','__hash__','__init'__,'__iter__','__len__','__new__',...]
時間複雜度爲O(n)blog
在python3的range中提供的方法:索引
dir(range) ['__class__','__contains__','__getitem__','__iter__','count','index','start','step','stop',...]
程序運行中會優先調用__contains__方法,此外還提供了start,stop,step 三個屬性內存
__contains__並非逐個迭代對比,而是:文檔
首先檢查 x 是否在start 和stop 範圍之間:start < = x <stop
若是在這個區間範圍,那麼再根據step計算x是否恰好落在range 區間中的某個值上,這裏用取模的方式來判斷 :(x - start)% step == 0
因此,range的時間複雜度爲O(1),也就是說無論range(start,stop,step)中的step值多大,時間複雜度都是一個常量,執行效率相對更高。get