作家
登录

深入Python列表的内部实现

作者: 来源: 2017-05-24 17:19:01 阅读 我要评论

 
  •  
  • app1: 
  •  
  •     n = size of list 
  •  
  •     call list_resize() to resize the list to size n+1 = 0 + 1 = 1 
  •  
  •     list[n] = list[0] = new element 
  •  
  •     return 0  
  • 下面是 list_resize() 函数。它会多申请一些内存,避免频繁调用 list_resize() 函数。列表的增长模式为:0,4,8,16,25,35,46,58,72,88……

    如今分派了 4 个用来装列表元素的槽空间,并且第一个空间中为整数 1。如下图显示 l[0] 指向我们新添加的┞符数对象。虚线的方框表示已经分派但没有应用的槽空间。

    列表追加元素操作的平均复杂度为 O(1)。

    持续添加新的元素:l.append(2)。调用 list_resize 函数,参数为 n+1 = 2, 然则因为已经申请了 4 个槽空间,所以不须要再申请内存空间。再添加两个整数的情况也是一样的:l.append(3),l.append(4)。下图显示了我们如今的情况。 

    本文将介绍列表在 CPython中的实现,因为毕竟Cpython 又是 Python 最为常用的实现。

    1. arguments: list object, where, new element 
    2.  
    3. returns: 0 if OK, -1 if not 
    4.  
    5. ins1: 
    6.  
    7.     resize list to size n+1 = 5 -> 4 more slots will be allocated 
    8.  
    9.     starting at the last element up to the offset whereright shift each element 
    10.  
    11.     set new element at offset where 
    12.  
    13.     return 0  

    虚线的方框依旧表示已经分派但没有应用的槽空间。如今分派了 8 个槽空间,然则列表的大年夜小却只是 5。

    列表插入操作的平均复杂度为 O(n)。

    Pop 操作

    掏出列表最后一个元素 即l.pop(),调用了 listpop() 函数。在 listpop() 函数中会调用 list_resize 函数,如不雅掏出元素后列表的大年夜小小于分派的槽空间数的一半,将会缩减列表的大年夜小。

    1. arguments: list object 
    2.  
    3. returns: element popped 
    4.  
    5. listpop: 
    6.  
    7.     if list empty: 
    8.  
    9.         return null 
    10.  
    11.     resize list with size 5 - 1 = 4. 4 

        推荐阅读

        Python爬虫爬取知乎小结

      比来进修了一点收集爬虫,并实现了应用Python来爬取知乎的一些功能,这里做一个小的总结。收集爬虫是指经由过程必定的规矩主动的大年夜网上抓取一些信息的法度榜样或脚本。我们知道机械进>>>详细阅读


      本文标题:深入Python列表的内部实现

      地址:http://www.17bianji.com/lsqh/35408.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)