爲何執行x in range(y)如此之快

  在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

相關文章
相關標籤/搜索