添加notify_all()
到每个deque
append
和popleft
导致deque
比默认行为实现的 20 倍改进deque
更糟糕的结果:
deque + notify_all: 0.469802
Queue: 0.667279
@Jonathan 稍微修改了他的代码,我使用 cPython 3.6.2 获得了基准,并在 deque 循环中添加了条件来模拟 Queue 的行为。
import time
from queue import Queue
import threading
import collections
mutex = threading.Lock()
condition = threading.Condition(mutex)
q = collections.deque()
t0 = time.clock()
for i in range(100000):
with condition:
q.append(1)
condition.notify_all()
for _ in range(100000):
with condition:
q.popleft()
condition.notify_all()
print('deque', time.clock() - t0)
q = Queue(200000)
t0 = time.clock()
for _ in range(100000):
q.put(1)
for _ in range(100000):
q.get()
print('Queue', time.clock() - t0)
并且似乎此功能限制了性能condition.notify_all()
collections.deque 是无界队列的替代实现,具有不需要锁定的快速原子 append() 和 popleft() 操作。
文档队列