python使用不同数据结构优化代码

  首先来看最常用的数据结构---list,它的内存管理类似C++的std::vector,即预先分配一定数量的‘车位’,当预分配的内存使用时,又继续往里插入元素,就会启动新一轮的内存分配。list对象会根据内存增长算法申请一块更大的内存,然后将原有的所有元素拷贝过去,销毁之前的内存,在插入新的元素。当删除元素时,也是类似,删除后发现已用空间比预分配空间的一半还少时,list会另外申请一块小内存,在做一次元素拷贝,然后销毁原有的大内存。可见,如果list对象经常有元素数量的‘巨变’,比如膨胀,收缩得很频繁,那么应当考虑使用deque。

  deque就是双端队列,同时具备栈和队列的特性,能够提供在两端插入和删除时复杂度为O(1)的操作。相对于list,它最大的优势在于内存管理方面。如果不熟悉C++的std::deque,那么可以把deque想象为多个list连在一起(仅为比喻,非精确描述),‘像火车一样,每一节车厢可以载客’,它的每一个‘list’也可以存储多个元素。他的优势在插入时,已有空间已经用完,那么他会申请一个‘车厢’来容纳新的元素,并将其与已有的其他‘车厢’串接起来,从而避免元素拷贝;在删除元素时也类似,某个‘车厢’空了,就‘丢弃’掉,无需移动元素。所以当出现元素数量‘局变’时,它的性能比list要好上许多倍。

  对于list这种序列容器来说,除了pop(0)和insert(0,v)这种插入操作非常耗时之外,查找一个元素是否在其中,也是O(n)的线性复杂度。在C语言中,标准库函数bsearch()能够通过二分查找算法在有序队列中快速查找是否存在某一个元素。在Python中,对保持list对象有序以及在有序队列中查找元素有非常好的支持,这时通过标准库bisect来实现的。(另一篇随笔中列出了几个bisect的用法)。

 

posted @ 2020-09-15 14:50  百鬼之主  阅读(164)  评论(0编辑  收藏  举报