From Python docs:
Deques are a generalization of stacks and queues (the name is pronounced “deck” and is short for “double-ended queue”). Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the same O(1) performance in either direction.
Though list objects support similar operations, they are optimized for fast fixed-length operations and incur O(n) memory movement costs for pop(0) and insert(0, v) operations which change both the size and position of the underlying data representation.
Deques support iteration, pickling, len(d), reversed(d), copy.copy(d), copy.deepcopy(d), membership testing with the in operator, and subscript references such as d[-1]. Indexed access is O(1) at both ends but slows to O(n) in the middle. For fast random access, use lists instead.
...
Now the difference is that the list is implemented with fixed size memory blocks (arrays), while deque is implemented as a double-linked list.
That means that lists have to realoacate memory and make copies of data depending on where you insert a new item, except when appending.
But random access (indexing) is very fast for them.
Deque doesn't have such problems because when inserting, only pointers should be corrected to insert a new node on the given position.
But finding data (the position for insert or random access - indexing) requires iteration over deque.
Deques are also thread safe, but unless you have to deal with endpoints i.e. use property of a queue lists are still your best friends.
Deques use a little bit more memory per item, because they store at least two more integers (pointers) with each item.
There is also matter of slicing a deque. It can be done manually by switching end-points of a deque using the rotate method. Getting the N items and then rotating back.
See from Python docs how del is implemented for only one item:
The rotate() method provides a way to implement deque slicing and deletion. For example, a pure Python implementation of del d[n] relies on the rotate() method to position elements to be popped:
def delete_nth(d, n):
d.rotate(-n)
d.popleft()
d.rotate(n)
I think that is enough for you. BTW, your Q is nearly a duplicate of:
How are deques in Python implemented, and when are they worse than lists?