python中是否存在非同步队列

python中是否存在非同步队列,python,python-3.x,queue,Python,Python 3.x,Queue,我正在练习使用python(实际上是Py3)进行编程竞赛。对于一个问题,我需要使用一个队列——我只需要把它放在一端,然后从另一端弹出。从我在文档中发现的情况来看,我似乎有两个选项queue.queue和queue.deque。我首先尝试使用queue.queue解决该问题,但我的解决方案超出了时间限制。然后我切换到queue.deque,我通过了这个问题(尽管接近极限) 从文档中可以看出,这两个容器都是线程安全的(至少对于deque的某些操作是如此),而对于我的情况,我永远不会使用多个线程。py

我正在练习使用python(实际上是Py3)进行编程竞赛。对于一个问题,我需要使用一个队列——我只需要把它放在一端,然后从另一端弹出。从我在文档中发现的情况来看,我似乎有两个选项
queue.queue
queue.deque
。我首先尝试使用queue.queue解决该问题,但我的解决方案超出了时间限制。然后我切换到
queue.deque
,我通过了这个问题(尽管接近极限)

从文档中可以看出,这两个容器都是线程安全的(至少对于deque的某些操作是如此),而对于我的情况,我永远不会使用多个线程。python中内置了一个简单的非同步队列吗?

当然不会进行同步;文档只是声明,由于附件和POP是原子的,所以它们保证是线程安全的。特别是在CPython中,除了全局解释器锁之外,没有任何锁。如果你需要一个double-eundqueue,或者说FIFO,那就是你应该使用的。如果您需要后进先出堆栈,请使用列表。在内部,
deque
实现使用

在内部使用一个;此外,它使用互斥锁来保护那些未通过
deque
原子化实现的剩余操作


因此,您的问题不在于选择
deque
,而很可能是算法的其他方面。

您可以使用两个普通列表(作为堆栈)来模拟队列

class Queue:
    def __init__(self):
        self.l1 = []   # Add new items here
        self.l2 = []   # Remove items here

    # O(1) time - simple stack push
    def enqueue(self, x):
        self.l1.append(x)

    # O(1) when l2 is not empty
    # O(k) if l2 is empty, but k is bounded by the number
    # of preceding calls to enqueue. Abusing the notation a bit,
    # you can think of the average for each call in a series to be
    # (k*O(1) + O(k))/k = O(1)
    def dequeue():
        if not self.l2:
            self.l2 = self.l1[::-1] #  Copy and reverse
            self.l1 = []
        return self.l2.pop()

你试过了吗?@PM2Ring这个容器似乎也同步了:
deque支持线程安全、内存高效的追加和弹出,从deque的任意一侧开始,在任意方向上都具有大致相同的O(1)性能。
See@PM2Ring I See,这样操作就不需要锁定。所以看来这个结构可能会起作用。您链接到的问题没有将collection.deque与queue.deque进行比较。他们如何比较?区别是什么?
queue.queue
(Python 2中的aka
queue.queue
)在内部使用
collections.deque
;如果您不需要
queue.queue
的特殊功能,则应使用普通的
collections.deque
。如果存在
collections.deque,则没有理由使用此功能;(另外,这是一个非线程安全的deque示例)问题明确指出线程安全不是问题。这只是为了指出,实现队列是相当简单的。