Deque random acces O (n) в python, а O (1) в С++, почему?

С++ deque:

Случайный доступ - постоянный O (1)

Python deque:

Индексированный доступ - это O (1) с обоих концов, но замедляется до O (n) в середине.

Если я ничего не пропущу, все остальное будет одинаково быстро для deques в python и на С++, по крайней мере сложным. Есть ли что-то, что делает python лучше для некоторых случаев? Если нет, то почему бы им просто не переключиться на то, что С++ имеет?

Ответ 1

Отказ от ответственности: этот ответ во многом вдохновлен комментарием Джеффа и ответом, уже опубликованным в Почему дека реализована как связанный список вместо кругового массива?

Ваш вопрос отличается по своей природе, но заголовок, приведенный выше, сам по себе является ответом: в Python модуль collection.deque имеет линейную временную сложность при доступе к элементам в середине, потому что он реализован с использованием связанного списка.

Из pydoc:

Список, подобный последовательности, оптимизированной для доступа к данным вблизи своих конечных точек.

Теперь, если вам интересно, почему была выбрана эта реализация, ответ уже доступен в сообщении, указанном Джеффом.

Ответ 2

Поскольку Deque - это структура данных, предназначенная для использования определенным образом, доступ к которой осуществляется первым или последним элементом, Но python иногда делает странные вещи со своими структурами данных и добавляет к ним больше функций или использует составленные структуры данных

В этом случае python имеет функцию

remove(value)
#Remove the first occurrence of value. If not found, raises a ValueError.

это позволяет вам получить доступ к элементам структуры данных в середине deque, это не "основная" операция этой структуры данных,

вызывает "но замедляет O (n) в середине".

Поскольку в этом случае он ведет себя как массив (проверяя значения один за другим)