【发布时间】:2016-01-20 12:21:08
【问题描述】:
我的代码有问题吗?使用collections 模块中的deque 而非常规列表对简单函数进行计时时,我的速度提高了 100 倍。
>>> from collections import deque as dl
>>> import cProfile
>>>
>>> def l(i):
... l = ['0','1','2','3','4','5','6']
... while i:
... l.insert(0,'9')
... i -= 1
...
>>> def d(i):
... l = dl('0123456')
... while i:
... l.appendleft('9')
... i -= 1
...
>>> cProfile.run('l(100000)')
100004 function calls in 4.480 seconds
[...]
>>> cProfile.run('d(100000)')
100004 function calls in 0.031 seconds
如果我的代码没问题,那么使用列表的意义何在?为什么不完全切换到deque?
【问题讨论】:
-
那么普通的
.append()...呢? -
根据文档,列表“针对快速固定长度操作进行了优化”;在这件事上将它们与
deques 进行比较并得出结论认为它们毫无意义是不公平的。 -
嗯,有三个可能的答案: 1. 还有一些你还没有想到的操作列表更快; 2. 除了操作速度之外,使用列表还有其他好处(例如,您是否比较了内存占用?);或者 3. 开发人员只是没有意识到他们可以一直使用双端队列。老实说,最后一个似乎最不可能!
-
简而言之,这是一个快速的项目访问。必须多次将某些内容插入列表的情况很少见。当你这样做时,是时候切换到队列或双端队列了。甚至并非总是如此。列表可以很好地附加和获取数据,这是它们最常见的用途。
-
如果 Deque 是列表的替代品,你不认为我们现在会改用它吗???
标签: python performance list deque cprofile