Насколько большим может быть список в Python? Мне нужен список примерно из 12000 элементов. Смогу ли я по-прежнему использовать методы списков, такие как сортировка и т. Д.?
120
Согласно исходному коду максимальный размер списка составляет PY_SSIZE_T_MAX/sizeof(PyObject*)
.
PY_SSIZE_T_MAX
определяется в pyport.h как((size_t) -1)>>1
В обычной 32-битной системе это (4294967295/2) / 4 или 536870912.
Следовательно, максимальный размер списка Python в 32-битной системе составляет 536 870 912 элементов.
Пока количество элементов у вас равно или меньше этого, все функции списка должны работать правильно.
sizeof(PyObject*) == 4?
? Что это собой представляет?PyObject *
. Это так называемый указатель (вы узнаете их по звездочке в конце). Указатели имеют длину 4 байта и хранят адрес памяти для выделенного объекта. Они имеют длину «всего» 4 байта, потому что с помощью 4 байтов вы можете адресовать каждый элемент в памяти современных компьютеров.PY_SSIZE_T_MAX
can очень велико.Как говорится в документации Python :
sys.maxsize
На моем компьютере (Linux x86_64):
источник
sys.maxsize
это ответ на вопрос. Разные архитектуры поддерживают разные максимумы.Конечно, это нормально. Собственно, вы сами легко можете убедиться:
Выполнение этих строк на моей машине заняло:
Но уверен, как все сказали. Чем больше массив, тем медленнее будут операции.
источник
В обычном коде я создал списки с миллионами элементов. Я считаю, что реализация списков в Python ограничена только объемом памяти в вашей системе.
Кроме того, методы / функции списка должны продолжать работать, несмотря на размер списка.
Если вы заботитесь о производительности, возможно, стоит изучить библиотеку, такую как NumPy .
источник
Характеристики производительности для списков описаны на Effbot.
Списки Python фактически реализованы как векторные для быстрого произвольного доступа, поэтому контейнер в основном будет содержать столько элементов, сколько есть места в памяти. (Вам нужно место для указателей, содержащихся в списке, а также место в памяти для объекта (ов), на который указывает.)
Добавление
O(1)
(амортизированная постоянная сложность), однако вставка / удаление из середины последовательности потребуетO(n)
переупорядочения (линейной сложности), которое будет медленнее по мере увеличения количества элементов в вашем списке.Ваш вопрос о сортировке более сложен, поскольку операция сравнения может занять неограниченное количество времени. Если вы выполняете очень медленное сравнение, это займет много времени, хотя это не ошибка типа данных списка Python .
Реверс просто занимает столько времени, сколько требуется для замены всех указателей в списке (обязательно
O(n)
(линейная сложность), поскольку вы касаетесь каждого указателя один раз).источник
12000 элементов - это ничто в Python ... и на самом деле количество элементов может доходить до тех пор, пока интерпретатор Python имеет память в вашей системе.
источник
Он различается для разных систем (зависит от оперативной памяти). Самый простой способ узнать это
import six six.MAXSIZE 9223372036854775807
Это дает максимальный размерlist
иdict
тоже, согласно документацииисточник
Я бы сказал, что вы ограничены только общим объемом доступной оперативной памяти. Очевидно, что чем больше массив, тем больше операций над ним потребуется.
источник
Я получил это отсюда на x64-битной системе: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 мая 2018 г., 01:54:01) [MSC v.1913 64 бит (AMD64)] на win32
источник
Нет ограничений по количеству списков. Основная причина вашей ошибки - это ОЗУ. Пожалуйста, увеличьте размер вашей памяти.
источник