Python中的有效队列/链表

时间:2013-07-17 10:47:07

标签: python queue deque

我需要在Python中编写事件日历,它允许在任何位置粘贴事件并作为FIFO(左侧的弹出元素)。

Python collections.deque可以有效地用作FIFO,但它不允许在当前元素之间粘贴元素。

另一方面,Python列表允许插入到中间,但是popleft效率低下。

那么,有什么妥协吗?

UPD 这种结构可能比队列更接近链表。标题改变了。

3 个答案:

答案 0 :(得分:3)

您可以查看blist。引自他们的网站:

blist是Python列表的替代品,可以在修改大型列表时提供更好的性能。

...

以下是blist渐近优于内置列表的一些用例:

Use Case                                      blist              list
--------------------------------------------------------------------------
Insertion into or removal from a list         O(log n)           O(n)
Taking slices of lists                        O(log n)           O(n)
Making shallow copies of lists                O(1)               O(n)
Changing slices of lists                      O(log n + log k)   O(n+k)
Multiplying a list to make a sparse list      O(log k)           O(kn)
Maintain a sorted lists with bisect.insort    O(log**2 n)        O(n)

这里有一些性能数字 - > http://stutzbachenterprises.com/performance-blist

答案 1 :(得分:3)

这有点像黑客,但您也可以使用SortedContainers模块中的SortedListWithKey数据类型。您只需要键返回一个常量,这样您就可以按照自己喜欢的方式排序元素。试试这个:

from sortedcontainers import SortedListWithKey

class FastDeque(SortedListWithKey):
    def __init__(self, iterable=None, **kwargs):
        super(FastDeque, self).__init__(iterable, key=lambda val: 0, **kwargs)

items = FastDeque('abcde')

print items
# FastDeque(['a', 'b', 'c', 'd', 'e'], key=<function <lambda> at 0x1089bc8c0>, load=1000)

del items[0]
items.insert(0, 'f')

print list(items)
# ['f', 'b', 'c', 'd', 'e']

FastDeque将有效支持快速随机访问和删除。 SortedContainers模块的其他好处:纯Python,快速实施,100%单元测试覆盖,数小时的压力测试。

答案 2 :(得分:2)

只是一个想法 - 您可以使用heapq来维护事件列表。作为堆中元素的优先级/键,您可以使用事件的时间戳。