- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题是这个问题的后续问题: deque.popleft() and list.pop(0). Is there performance difference?
在 Python 中,我可以使用 .pop()
弹出添加到列表中的最后一项。我还可以使用 dequeue 和 .pop()
弹出最后一项。
这两者之间有性能差异吗?是否有理由或用例应该使用其中一种而不是另一种?
编辑:拼写错误....将.popright更改为.pop - deque的“pop right”仍然只是.pop -谢谢ShadowRanger
最佳答案
首先,它的名字是 pop
对于两者list
和deque
,没有popright
方法deque
s。
两者之间通常没有有意义的性能差异;每隔一段时间,一个pop
在deque
上会导致 block 释放(它具有固定的开销,它只会使特定的 pop
的成本更高一些),并且在 list
上它可能会导致 realloc 缩小底层存储(最终可能是 O(n)
,但只有 pop
的一小部分会导致它);渐进地它们都是 O(1)
运营。如果您list
确实很大,然后缩小很多,当它缩小底层存储时,您可能会偶尔遇到性能问题,但除此之外,您不太可能注意到差异。
回答您的问题,deque
作为堆栈使用时,s 的效率比 list
稍微高一些。 s;如果您要导入collections
无论如何,并且需要一个基于堆栈的结构,使用 deque
会给你带来一点好处(至少在 CPython 上,不能与其他实现交谈)。但这里并不值得进行微观优化;进口成本collections
首先,以及基于此堆栈执行的任何有用代码的成本,可能会让您在 list
之间看到的任何微小差异相形见绌。和deque
对于 pop
从右边开始。一个简单的ipython3
微基准:
In [24]: %%timeit from collections import deque; s = deque([0] * 10000); onethousandnones = (None,) * 1000; pop = s.pop
...: ; push = s.append
...: for _ in onethousandnones:
...: pop()
...: for _ in onethousandnones:
...: push(0)
...:
...:
104 µs ± 7.99 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [25]: %%timeit s = [0] * 10000; onethousandnones = (None,) * 1000; pop = s.pop; push = s.append
...: for _ in onethousandnones:
...: pop()
...: for _ in onethousandnones:
...: push(0)
...:
...:
131 µs ± 8.93 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
因此,对于 1000 次弹出操作,然后是 1000 次压入堆栈,deque
基于堆栈的时间减少了 30 µs(每次操作减少了大约 15 ns)。现在不可否认的是,如果我删除调用括号来计时基本开销,则基本开销约为 50 µs,因此开销具体归因于 list
是 deque
的“最低成本”的很大一部分。 ,但在程序的上下文中它仍然相当小,该程序可能正在做一些有用的事情,而不仅仅是插入和弹出到堆栈。而且无论大小如何,它都非常稳定;对于大小为 10 倍的堆栈, deque
的成本保持不变和list
。如果堆栈的增长和收缩幅度如此之大,则 list
的摊销增长正在开始,它可能会因更大的重新分配而受到更多影响,但这通常不需要担心。
关于python - list.pop() 和 deque.pop() ——有性能差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57438319/
这个问题在这里已经有了答案: Is using std::deque or std::priority_queue thread-safe? [duplicate] (3 个答案) Thread s
我是一名学生,我的操作系统类(class)项目有一点问题,这对于作业规范本身来说有点多余: 虽然我可以将 100 万个双端队列推送到我的双端队列中,但我无法推送约 1000 万或更多。 现在,在实际的
std::deque 在 CppReference 中有很好的记录,但是 boost::deque 的 documentation看起来和标准的一样,只是增加了一些方法,比如nth和index_of。
Scala 是否具有类似于 Java Deque 或 Python deque 的双面队列? 我在 Scala 2.12 API 中只看到 Stack 和 Queue 但只想仔细检查一下。 最佳答案
好的,我正在实现一个与 Apple 的日历应用程序非常相似的日历。我的 UICollectionView 中有多种类型的单元格。我有垂直线单元格、水平线单元格、现在线单元格和事件单元格。 每当我滚动时
目前在我的项目中我有两个静态方法PushObjects 和ProcessObject。 PushObject 方法将数据推回静态双端队列,此方法可由多个线程访问,但 ProcessObject 始终由
使用 http://www.cppreference.com/wiki/stl/deque/insert作为引用,我在某些位置将值插入双端队列。 例如,如果双端队列 A 是: a, b, d, e,
Python 的 collections.deque有一个 maxlen 参数,这样 [...] the deque is bounded to the specified maximum lengt
这是我的第一个问题,希望大家都好。我必须编写双端队列或双端队列的数组实现,但在理解前面方法的入队元素时遇到了一些麻烦,我通过摆弄了一下让它工作,但我仍然很难理解逻辑: void addAtFront(
我试图解决 Java Deque 上的 HackerRank 问题。除了具有 100,000 个输入的案例之外,我的代码通过了所有案例。 问题:在这个问题中,给你 N 个整数。您需要在大小为 M 的所
我正在编写 Deque 以便能够从 Front 和 Rear 中添加和删除....我认为我的逻辑是错误的,但我无法弄清楚!因为当我从前面插入时,它必须从后面移除,但也从前面移除。 你会检查我的代码并帮
我在使用 deque 容器时有些困惑。 我将 vector 与 deque 进行了比较,我动态地输入了 Integer 值并观察到在几次插入之后 vector 的对象开始四处移动并且地址已被更改,这似
由于我对内存有严格的要求,因此在从双端队列的开头删除一个范围后,我尝试使用deque::shrink_to_fit。但是,它不起作用,我只看到libstdc++使用带有副本的swap技巧实现了shri
我需要为继承到 deque 的类添加功能,但更喜欢看到 collections.deque 中的代码来实现一个新类 final。 >>> from _collections import deque,
本文实例讲述了python3 deque 双向队列创建与使用方法。分享给大家供大家参考,具体如下: 创建双向队列 ?
考虑以下 C++ 程序: #include #include using namespace std; int main() { deque d(30000000); cout
尝试使用 Deque 数据结构来回答一个编程问题,以查找乘积小于目标的所有子数组。 如上所述,我想使用 Deque 数据结构。我查看了用法,认为我做对了,但是使用了 const Deque = req
双端队列实现我实现了一个通用的 Deque 数据结构。 请检查此实现 这个错误对我来说没有意义,请告诉我一点信息 import java.util.NoSuchElementException; im
我需要编写自己的 Deque 类,并且必须使用双向链表实现来存储数据。问题是编写方法pushfromLeft(Thing thing),它将插入到双端队列的左侧。以下是我迄今为止所拥有的,但似乎不起作
标准说: A deque is a sequence container that supports random access iterators (27.2.7). In addition, it
我是一名优秀的程序员,十分优秀!