Насколько большой может получить список Python?
В Python, насколько большой может получить список? Мне нужен список около 12000 элементов. Смогу ли я по-прежнему запускать методы списка, такие как сортировка и т. Д.?
10 ответов
Согласно исходному коду, максимальный размер списка 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 элементов.
Пока количество элементов у вас равно или меньше этого, все функции списка должны работать правильно.
Как сказано в документации Python:
sys.maxsize
Наибольшее положительное целое число, поддерживаемое типом платформы Py_ssize_t, и, таким образом, может иметь списки максимального размера, строки, dicts и многие другие контейнеры.
На моем компьютере (Linux x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
Конечно, все в порядке. На самом деле вы можете легко убедиться в этом:
l = range(12000)
l = sorted(l, reverse=True)
Выполнение этих строк на моей машине заняло:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
Но уверен, как и все остальные. Чем больше массив, тем медленнее будут операции.
В случайном коде я создал списки с миллионами элементов. Я считаю, что реализация списков в Python ограничена только объемом памяти в вашей системе.
Кроме того, методы / функции списка должны продолжать работать, несмотря на размер списка.
Если вы заботитесь о производительности, возможно, стоит заглянуть в такую библиотеку, как NumPy.
12000 элементов - это ничто в Python... и на самом деле количество элементов может доходить до того, что интерпретатор Python имеет память в вашей системе.
Это варьируется для разных систем (зависит от оперативной памяти). Самый простой способ узнать это
import six
six.MAXSIZE
9223372036854775807
Это дает максимальный размер list
а также dict
тоже согласно документации
Характеристики производительности для списков описаны на Effbot.
Списки Python фактически реализованы как вектор для быстрого произвольного доступа, поэтому в контейнере будет в основном столько элементов, сколько есть места в памяти. (Вам нужно место для указателей, содержащихся в списке, а также место в памяти для объектов, на которые указывают).
Добавление является O(1)
(амортизируемая постоянная сложность), однако, вставка в / удаление из середины последовательности потребует O(n)
(линейная сложность) переупорядочение, которое будет становиться медленнее, чем количество элементов в вашем списке.
Ваш вопрос сортировки более нюансов, так как операция сравнения может занять неограниченное количество времени. Если вы выполняете очень медленные сравнения, это займет много времени, хотя это и не ошибка в типе данных списка Python.
Реверсирование просто занимает время, необходимое для замены всех указателей в списке (обязательно O(n)
(линейная сложность), так как вы касаетесь каждого указателя один раз).
Я получил это отсюда на 64-битной системе: Python 3.7.0b5 (v3.7.0b5:abb8802389, 31 мая 2018, 01:54:01) [MSC v.1913 64 бит (AMD64)] на win32
Я бы сказал, что вы ограничены только общим объемом доступной оперативной памяти. Очевидно, что чем больше массив, тем дольше будут выполняться операции с ним.
Нет ограничений по номеру списка. Основная причина, которая вызывает вашу ошибку - это оперативная память. Пожалуйста, обновите ваш объем памяти.