栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

deque.popleft()和list.pop(0)。有性能差异吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

deque.popleft()和list.pop(0)。有性能差异吗?

deque.popleft()比list.pop(0)更快,这是因为deque已被优化以在O(1)中执行popleft(),而list.pop(0)需要O(n)(请参阅deque对象) 。

_collectionsmodule.c中用于deque的注释和代码以及listobject.c中用于list的注释和代码提供了实现见解,以解释性能差异。即,双端队列对象“由双向链接列表组成”,可以有效地优化两端的追加和弹出,而列表对象甚至不是单链接列表,而是C数组(指向元素的指针)(请参阅Python
2.7 listobject。
h#l22

和Python
3.5
listobject.h#l23
),这使其非常适合元素的快速随机访问,但在移除第一个元素之后需要O(n)时间来重新放置所有元素。

对于Python 2.7和3.5,这些源代码文件的URL为:

  1. https://hg.python.org/cpython/file/2.7/Modules/_collectionsmodule.c

  2. https://hg.python.org/cpython/file/2.7/Objects/listobject.c

  3. https://hg.python.org/cpython/file/3.5/Modules/_collectionsmodule.c

  4. https://hg.python.org/cpython/file/3.5/Objects/listobject.c

使用%timeit,当双端队列和列表具有相同的52个元素时,deque.popleft()和list.pop(0)之间的性能差异约为4倍,而当长度为10
** 8。测试结果如下。

import stringfrom collections import deque%timeit d = deque(string.letters); d.popleft()1000000 loops, best of 3: 1.46 µs per loop%timeit d = deque(string.letters)1000000 loops, best of 3: 1.4 µs per loop%timeit l = list(string.letters); l.pop(0)1000000 loops, best of 3: 1.47 µs per loop%timeit l = list(string.letters);1000000 loops, best of 3: 1.22 µs per loopd = deque(range(100000000))%timeit d.popleft()10000000 loops, best of 3: 90.5 ns per loopl = range(100000000)%timeit l.pop(0)10 loops, best of 3: 93.4 ms per loop


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639510.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号