Altcademy - a Forbes magazine logo Best Coding Bootcamp 2023

what built-in Python data type is best suited for implementing a queue

Understanding Queues in Programming

When you're standing in line at a grocery store, you expect the first person in line to be served first. This concept is not just a societal norm but also a fundamental principle in programming known as a "queue". A queue follows the First-In, First-Out (FIFO) principle. This means that the first element added to the queue will be the first one to be removed.

Imagine a queue as a line of people waiting for a bus. The person at the front of the line boards the bus first, and new passengers join the end of the line. In programming, we use queues for tasks that need to be processed in the order they were received, like printing documents or handling requests to a server.

Python's List as a Queue

One of the simplest ways to implement a queue in Python is by using a list. Lists are a collection of items that can grow and shrink as needed. You can think of a list like a stretchy rubber band that holds items in a particular order.

Enqueuing with append()

To add an item to the queue, you use the append() method, which is like joining the end of the line.

queue = []
queue.append('Alice')
queue.append('Bob')
queue.append('Charlie')
print(queue)  # Output: ['Alice', 'Bob', 'Charlie']

Dequeuing with pop(0)

To remove an item from the queue (to serve the first person in line), you use the pop(0) method, which removes the first item in the list.

served = queue.pop(0)
print(served)  # Output: 'Alice'
print(queue)  # Output: ['Bob', 'Charlie']

However, using a list as a queue has a downside. Every time you pop(0), all the other elements have to move one space forward. This is like everyone in line taking a step forward, which is inefficient and can be slow if the line is very long.

The collections.deque

Python provides a more efficient data type for implementing a queue called deque, which stands for "double-ended queue". It's part of the collections module and is designed to allow fast appends and pops from both ends.

Creating a deque

To use a deque, you first need to import it:

from collections import deque

queue = deque()

Enqueuing with append()

Adding items to a deque is similar to adding them to a list:

queue.append('Alice')
queue.append('Bob')
queue.append('Charlie')
print(queue)  # Output: deque(['Alice', 'Bob', 'Charlie'])

Dequeuing with popleft()

To remove items, you use the popleft() method, which is optimized for deque:

served = queue.popleft()
print(served)  # Output: 'Alice'
print(queue)  # Output: deque(['Bob', 'Charlie'])

popleft() is much faster than pop(0) on a list because the deque is designed to allow quick removal of the first element without having to shift all other elements.

Why deque is the Best Choice for a Queue

The deque is the best choice for a queue in Python because it is specifically designed for this purpose. It allows you to add and remove items efficiently, without the performance penalty that comes with using a list.

Let's compare the performance of a list and a deque. With a list, as the queue gets longer, the time it takes to pop(0) increases. With a deque, the time it takes to popleft() stays consistent, no matter how many items are in the queue.

Practical Example: A Print Queue

Let's put our knowledge into practice with a real-world example: a print queue. Imagine you have multiple documents to print, and you want to print them in the order they were sent to the printer.

from collections import deque

print_queue = deque()

# Adding documents to the queue
print_queue.append('Document1.pdf')
print_queue.append('Document2.pdf')
print_queue.append('Document3.pdf')

# Printing the documents
while print_queue:
    current_document = print_queue.popleft()
    print(f'Printing {current_document}')
    # Output:
    # Printing Document1.pdf
    # Printing Document2.pdf
    # Printing Document3.pdf

In this example, documents are added to the queue using append() and printed (removed from the queue) using popleft(). This ensures that the documents are printed in the order they were received.

Conclusion: Queue It Up!

In the world of Python programming, the deque from the collections module is your go-to data type for implementing an efficient and fast queue. It's like having a VIP pass at an amusement park; you get to enjoy the rides (enqueue and dequeue operations) without the long wait (performance issues).

Whether you're managing tasks, handling operations, or just organizing data, remember that the deque is your friend for maintaining order and efficiency. So next time you're coding up a task that needs to be handled in a first-come, first-served basis, think of the deque as your digital queue manager, keeping things moving smoothly and swiftly, just like a well-organized line for the newest roller coaster. Happy coding!