Насколько большим может быть список в Python? Мне нужен список примерно из 12000 элементов. Смогу ли я по-прежнему использовать методы списков, такие как сортировка и т. Д.?
Насколько большим может быть список в Python? Мне нужен список примерно из 12000 элементов. Смогу ли я по-прежнему использовать методы списков, такие как сортировка и т. Д.?
Ответы:
Согласно исходному коду максимальный размер списка составляет 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 элементов.
Пока количество элементов у вас равно или меньше этого, все функции списка должны работать правильно.
PyObject *
. Это так называемый указатель (вы узнаете их по звездочке в конце). Указатели имеют длину 4 байта и хранят адрес памяти для выделенного объекта. Они имеют длину «всего» 4 байта, потому что с помощью 4 байтов вы можете адресовать каждый элемент в памяти современных компьютеров.
PY_SSIZE_T_MAX
can очень велико.
Как говорится в документации Python :
sys.maxsize
Наибольшее положительное целое число, поддерживаемое типом Py_ssize_t платформы, и, следовательно, списки максимального размера, строки, словари и многие другие контейнеры могут иметь.
На моем компьютере (Linux x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
sys.maxsize
это ответ на вопрос. Разные архитектуры поддерживают разные максимумы.
Конечно, это нормально. Собственно, вы сами легко можете убедиться:
l = range(12000)
l = sorted(l, reverse=True)
Выполнение этих строк на моей машине заняло:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
Но уверен, как все сказали. Чем больше массив, тем медленнее будут операции.
В обычном коде я создал списки с миллионами элементов. Я считаю, что реализация списков в Python ограничена только объемом памяти в вашей системе.
Кроме того, методы / функции списка должны продолжать работать, несмотря на размер списка.
Если вы заботитесь о производительности, возможно, стоит изучить библиотеку, такую как NumPy .
Характеристики производительности для списков описаны на Effbot.
Списки Python фактически реализованы как векторные для быстрого произвольного доступа, поэтому контейнер в основном будет содержать столько элементов, сколько есть места в памяти. (Вам нужно место для указателей, содержащихся в списке, а также место в памяти для объекта (ов), на который указывает.)
Добавление O(1)
(амортизированная постоянная сложность), однако вставка / удаление из середины последовательности потребует O(n)
переупорядочения (линейной сложности), которое будет медленнее по мере увеличения количества элементов в вашем списке.
Ваш вопрос о сортировке более сложен, поскольку операция сравнения может занять неограниченное количество времени. Если вы выполняете очень медленное сравнение, это займет много времени, хотя это не ошибка типа данных списка Python .
Реверс просто занимает столько времени, сколько требуется для замены всех указателей в списке (обязательно O(n)
(линейная сложность), поскольку вы касаетесь каждого указателя один раз).
Он различается для разных систем (зависит от оперативной памяти). Самый простой способ узнать это
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
Нет ограничений по количеству списков. Основная причина вашей ошибки - это ОЗУ. Пожалуйста, увеличьте размер вашей памяти.
sizeof(PyObject*) == 4?
? Что это собой представляет?