Python优先级队列put列表编号

Python优先级队列put列表编号,python,cython,priority-queue,Python,Cython,Priority Queue,在python模块中,类似于优先级队列, 但我把它放在整数列表中,它会根据列表中的最大值进行比较 例如: priority_queue qu a = [1,1,1,5] b = [2,4,7,2] c = [1,2,2] qu.put(c) qu.put(b) qu.put(a) qu.get() #will be b = [2,4,7,2], because max(b)=7 > max(a) > max(c) qu.get() #will be a = [1,1,1,5], b

在python模块中,类似于优先级队列, 但我把它放在整数列表中,它会根据列表中的最大值进行比较

例如:

priority_queue qu
a = [1,1,1,5]
b = [2,4,7,2]
c = [1,2,2]
qu.put(c)
qu.put(b)
qu.put(a)

qu.get() #will be b = [2,4,7,2], because max(b)=7 > max(a) > max(c)
qu.get() #will be a = [1,1,1,5], because max(a)=5 > max(c)
qu.get() #will be c = [1,2,3] 
#compare lsit by thier max value
我希望这个队列尽可能快。 如果不存在模块,那么可能是Cython与C++优先级队列 小小的改变。
有可能吗?

插入时创建自己的密钥,并将该密钥与列表配对插入:

a = [1,1,1,5]
b = [2,4,7,2]
c = [1,2,2]
# Use -max as key, since queue is ordered by smallest key
qu.put((-max(c), c))
qu.put((-max(b), b))
qu.put((-max(a), a))

qu.get()[1] #will be b = [2,4,7,2], because max(b)=7 > max(a) > max(c)
qu.get()[1] #will be a = [1,1,1,5], because max(a)=5 > max(c)
qu.get()[1] #will be c = [1,2,2] 
如果需要,您可以编写一个简单的
PriorityQueue
子类,在
put
上自动键入,并在
get
上剥离。最简单的版本是:

class ByMaxPriorityQueue(PriorityQueue):
    # Threadsafe way to generate a simple tiebreaker value
    tiebreaker = itertools.count()

    def put(self, val, *args, **kwargs):
        super().put((-max(val), next(self.tiebreaker), val), *args, **kwargs)
    def get(self, *args, **kwargs):
        key, tie, val = super().get(*args, **kwargs)
        return val

该类的行为将完全符合您的需要,无需手动创建和剥离键值(并且它将使用first to
put
,而不是字典列表比较,这要归功于使用
itertools.count
来生成平分符)。

您可以使用
heapq
。以下是文档:在heapq中,您不能为优先级定义自己的比较函数。\u队列我找到了这篇关于heapq的文章,这篇文章也可以帮助您,感谢您的解决方案。但它的速度足以容纳至少10000个项目吗?@lukaskiss:它将尽可能快,而无需在C扩展中重新实现东西,这会增加各种复杂度。它是否足够快基本上是一个测试问题(在知道这是一个问题之前不要进行优化)。键只在插入时生成,因此它们永远不会重新计算
PriorityQueue
是使用
heapq
模块(用C实现)以
list
的形式实现的,因此
put
s和
get
s将在成本中摊销
O(log n)
。注意:在CPython中,线程通常不能很好地用于CPU受限的任务,这要归功于。