python 性能提升之使用deque代替list

       使用list的好处是,对于固定长度的情形,list各种操作都是被极致优化的,比如当我们想要直接通过下标获取元素时,其复杂度为O(1),是高效的获取方式。但是,当我们需要频繁对list进行一些pop(0)或者insert之类的会同时改变list的长度和元素索引的操作时,会导致list在内存中复制,即空间复杂度为O(n)的操作;此外,如果频繁的append,且会造成list对象的元素数量较大的变化,同样也会进行复制。此时,我们可以使用python标准库collections中deque数据结构,这样可以较大的提升程序的性能。

复制是一中很消耗时间的操作,因此这会导致程序性能的显著下降。

当创建一个list对象时,python会在内存中获取一块地址保存,但是保存list的内存并不完全等于list内元素占据的内存大小,而是会多预留一些内存空间,这样如果需要增加元素,就不需要再重新创建对象,而是直接在原list内存地址上增加元素即可。但是,当频繁的增加元素,预留内存空间不够时,python会获取一块更大的内存,并将原list复制后销毁;同样的,如果不断的减少元素,当元素实际占用内存小于list占用内存一半时,python也会将list复制到一块更小的内存上,以节省内存的使用。

这种机制的影响就是,如果频繁的增加或减少元素,修改list,会导致list在内存中多次的复制,这样就会降低程序的性能。

deque这种数据结构不存在这种限制,当对deque对象进行增加或删除元素时,deque不会进行复制操作,而是直接获取内存存放新的元素。但比如deque如果想要获取某个元素的索引,时间复杂度机会降为O(n),因此,对于固定长度对象的操作,使用列表,对于需要频繁增加或者减少元素的情形,使用deque.关于deque的详细文档,可看这里。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值