Это связанный список, массив? Я искал вокруг и нашел только людей, догадывающихся. Мои знания C не достаточно хороши, чтобы смотреть на исходный код.
184
Это связанный список, массив? Я искал вокруг и нашел только людей, догадывающихся. Мои знания C не достаточно хороши, чтобы смотреть на исходный код.
Это динамический массив . Практическое доказательство: индексирование занимает (конечно, с очень небольшими различиями (0,0013 мкс!)) Одно и то же время независимо от индекса:
...>python -m timeit --setup="x = [None]*1000" "x[500]"
10000000 loops, best of 3: 0.0579 usec per loop
...>python -m timeit --setup="x = [None]*1000" "x[0]"
10000000 loops, best of 3: 0.0566 usec per loop
Я был бы поражен, если бы IronPython или Jython использовали связанные списки - они бы испортили производительность многих широко используемых библиотек, построенных на предположении, что списки являются динамическими массивами.
x=[None]*1000
измерение любой возможной разницы доступа к списку довольно неточным. Вам нужно выделить инициализацию:-s "x=[None]*100" "x[0]"
Код C довольно прост, на самом деле. Раскрывая один макрос и удаляя несколько ненужных комментариев, основная структура находится в том
listobject.h
, что список определяется как:PyObject_HEAD
содержит счетчик ссылок и идентификатор типа. Итак, это вектор / массив, который перераспределяется. Код для изменения размера такого массива, когда он заполнен, находится вlistobject.c
. На самом деле массив не удваивается, а растет за счетдо емкости каждый раз, где
newsize
запрашиваемый размер (не обязательно,allocated + 1
потому что вы можетеextend
использовать произвольное количество элементов вместо того, чтобы использоватьappend
их один за другим).Смотрите также FAQ по Python .
источник
array
модуль или NumPy предпочтительнее.В CPython списки являются массивами указателей. Другие реализации Python могут хранить их различными способами.
источник
Это зависит от реализации, но IIRC:
ArrayList
Таким образом, все они имеют O (1) произвольный доступ.
источник
O(1)
индексирование списков является довольно распространенным и верным предположением, ни одна реализация не осмелится нарушить его.Я бы предложил статью Лорана Люса "Реализация списка Python" . Было действительно полезно для меня, потому что автор объясняет, как список реализован в CPython и использует отличные диаграммы для этой цели.
...
...
...
...
источник
aggregation
неcomposition
. Хотелось бы, чтобы был список композиций.Согласно документации ,
источник
Как уже указывалось выше, списки (когда они заметно велики) реализуются путем выделения фиксированного объема пространства и, если это пространство должно заполняться, выделения большего объема пространства и копирования элементов.
Чтобы понять, почему метод амортизируется O (1), без потери общности, предположим, что мы вставили a = 2 ^ n элементов, и теперь мы должны удвоить нашу таблицу до размера 2 ^ (n + 1). Это означает, что в настоящее время мы делаем 2 ^ (n + 1) операций. Последняя копия, мы сделали 2 ^ n операций. До этого мы сделали 2 ^ (n-1) ... вплоть до 8,4,2,1. Теперь, если мы сложим их, мы получим 1 + 2 + 4 + 8 + ... + 2 ^ (n + 1) = 2 ^ (n + 2) - 1 <4 * 2 ^ n = O (2 ^ n) = O (a) общее количество вставок (т.е. O (1) амортизированное время). Кроме того, следует отметить, что если таблица допускает удаление, сжатие таблицы должно выполняться с другим фактором (например, 3x)
источник
Список в Python - это что-то вроде массива, в котором вы можете хранить несколько значений. Список изменчив, что означает, что вы можете изменить его. Более важная вещь, которую вы должны знать, когда мы создаем список, Python автоматически создает reference_id для этой переменной списка. Если вы измените его, назначив другие переменные, основной список будет изменен. Давайте попробуем с примером:
Мы добавляем,
my_list
но наш основной список изменился. Список того среднего значения не был назначен как список копий, назначенный в качестве его ссылки.источник
В CPython список реализован как динамический массив, и поэтому, когда мы добавляем в это время, добавляется не только один макрос, но выделяется еще некоторое пространство, чтобы каждый раз не добавлялось новое пространство.
источник