zoukankan      html  css  js  c++  java
  • 为什么执行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值多大,时间复杂度都是一个常量,执行效率相对更高。

  • 相关阅读:
    jQuery及javascript DOM创建节点(三)
    jQueryEasyUI Window的基本使用
    3.1、值类型
    手动依赖注入(二)
    3.1.2、字符类型
    不错不错
    我们应该讨论什么? 就面向对象的讨论所引发的一些思考
    保存个地址, 顺便问个问题~
    嗯嗯, 今天很高兴
    方法级AOP: 又一个补丁
  • 原文地址:https://www.cnblogs.com/sxh-myblogs/p/8810396.html
Copyright © 2011-2022 走看看