Friday, December 27, 2024
Google search engine
HomeLanguagesDifference between queue.queue vs collections.deque in Python

Difference between queue.queue vs collections.deque in Python

Both queue.queue and collections.deque commands give an idea about queues in general to the reader but, both have a very different application hence shouldn’t be confused as one. Although they are different and used for very different purposes they are in a way linked to each other in terms of complete functionality. Before we jump into what they actually do and how they are linked to each other, there is one concept that has to be revisited, the basics of processing in computer software. 

We know, that any program becomes a process in active state and each process can be broken down to threads to reap the benefits of the advantage this possesses. We also know, that two threads may have to communicate with each other and this is where queue.queue comes into the picture. Collections.deque on the other hand is used as a data structure within a thread to perform certain functionality. The link between them is that queue.queue uses collections.deque internally. Both deal with thread-safe operations.

Queue.Queue: This class as stated above is used to facilitate communication between two threads originating from the same process. It works like a typical queue though, the only difference being the purpose it serves. It has all the functions of multirocessing.queue to do so, along with two more functions- task_done() and join().

  • As the name suggests, task_done() is used to inform task completion
  • Join() is used to ask all the tasks to wait until all processes are done processing.

Python3




# import modules
import threading, queue
 
# setting up a queue for threads
q = queue.Queue()
 
def execute_thread():
    while True:
        th=q.get()
        print(f'task {th} started')
        print(f'task {th} finished')
        q.task_done()
 
# set up for threads to work
threading.Thread(target = execute_thread,
                 daemon = True).start()
 
# sending task requests
for i in range(5):
    q.put(i)
print("all tasks sent")
 
 
# making threads wait until all tasks are done
q.join()
print("all tasks completed")


Output:

all tasks sent
task 0 started
task 0 finished
task 1 started
task 1 finished
task 2 started
task 2 finished
task 3 started
task 3 finished
task 4 started
task 4 finished
all tasks completed

The time complexity of this code is O(n), where n is the number of tasks.
The auxiliary space complexity of this code is O(1), as it uses a constant amount of memory throughout its execution. 

Collections.Deque: A general data structure, which behaves like a regular FIFO Queue. This is employed within a thread to get some functionality done. Its basic implementation is shown below:

Python3




# import module
from collections import deque
 
# initialise
dq = deque(['first','second','third'])
print(dq)
deque(['first', 'second', 'third'])
 
# adding more values
dq.append('fourth')
dq.appendleft('zeroth')
print(dq)
deque(['zeroth', 'first', 'second', 'third', 'fourth'])
 
# adding value to a specified index
dq.insert(0,'fifth')
print(dq)
deque(['fifth', 'zeroth', 'first', 'second', 'third', 'fourth'])
 
# removing values
dq.pop()
'fourth'
print(dq)
deque(['fifth', 'zeroth', 'first', 'second', 'third'])
dq.remove('zeroth')
print(dq)
deque(['fifth', 'first', 'second', 'third'])


Output:

deque([‘first’, ‘second’, ‘third’]) deque([‘zeroth’, ‘first’, ‘second’, ‘third’, ‘fourth’]) deque([‘fifth’, ‘zeroth’, ‘first’, ‘second’, ‘third’, ‘fourth’]) deque([‘fifth’, ‘zeroth’, ‘first’, ‘second’, ‘third’]) deque([‘fifth’, ‘first’, ‘second’, ‘third’])

RELATED ARTICLES

Most Popular

Recent Comments