我需要在Python中编写事件日历,它允许在任何位置粘贴事件并作为FIFO(左侧的弹出元素)。
Python collections.deque可以有效地用作FIFO,但它不允许在当前元素之间粘贴元素。
另一方面,Python列表允许插入到中间,但是popleft效率低下。
那么,有什么妥协吗?
UPD 这种结构可能比队列更接近链表。标题改变了。
答案 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
来维护事件列表。作为堆中元素的优先级/键,您可以使用事件的时间戳。