2

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

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

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

那么,有什么妥协吗?

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

4

3 回答 3

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、快如 C 的实现、100% 的单元测试覆盖率、数小时的压力测试。

于 2015-02-14T01:32:57.803 回答
2

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

于 2013-07-17T11:31:05.127 回答
2

你可以看看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

于 2013-07-17T11:31:58.223 回答