为什么执行x in range(y)如此之快

Posted 你所信必为你所见

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么执行x in range(y)如此之快相关的知识,希望对你有一定的参考价值。

  在python2中,range函数返回一个列表对象,一次性把所有的元素加载到内存中,所以有时会感觉系统卡顿。

   xrange和python3中的range函数类似,都是返回一个迭代器对象。在取数很大的时候执行结果相差悬殊。

   原因:

    python文档 in 的规则:

如果该类实现了__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)

    在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值多大,时间复杂度都是一个常量,执行效率相对更高。

 

以上是关于为什么执行x in range(y)如此之快的主要内容,如果未能解决你的问题,请参考以下文章

DFT 和 FFT 之间有啥区别使 FFT 如此之快?

廖雪峰py笔记4,循环。

为啥临时表会使这个查询变得如此之快?

python for i in range(x)应用的问题

错误处理:IndexError: index out of range in self

为啥带有“直接”(O_DIRECT)标志的 dd 速度如此之快?