为何执行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

相关文章
相关标签/搜索