Насколько большой может получить массив Python?
в Python, насколько большой может получить массив / список? Мне нужен массив около 12000 элементов. Смогу ли я по-прежнему запускать методы массива/списка, такие как сортировка и т. д.?
9 ответов
По словам исходный код максимальный размер списка составляет 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 платформы, и, следовательно, списки максимального размера, строки, дикты и многие другие контейнеры могут иметь.
на моем компьютере (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 связана только объемом памяти в вашей системе.
кроме того, методы / функции списка должны продолжать работать, несмотря на размер списка.
Если вы заботитесь о производительности, возможно, стоит заглянуть в библиотеку, такую как включает в себя.
характеристики производительности для списков описаны на Effbot.
списки Python фактически реализованы как вектор для быстрого произвольного доступа, поэтому контейнер в основном будет содержать столько элементов, сколько есть места в памяти. (Вам нужно пространство для указателей, содержащихся в списке, а также пространство в памяти для объекта(ов), на который указывают.)
добавление O(1)
(амортизированная постоянная сложность), однако, вставка в / удаление из середины из последовательности потребуется O(n)
(линейная сложность) переупорядочивание, которое будет замедляться по мере увеличения количества элементов в вашем списке.
ваш вопрос сортировки более нюансирован, так как операция сравнения может занять неограниченное количество времени. Если вы выполняете действительно медленные сравнения, это займет много времени, хотя это не вина тип данных списка Python.
разворот просто занимает время, необходимое для замены всех указателей в список (обязательно O(n)
(линейная сложность), так как вы касаетесь каждого указателя один раз).
12000 элементов-это ничто в Python... и на самом деле количество элементов может доходить до того, что интерпретатор Python имеет память в вашей системе.
Я бы сказал, что вы ограничены только общим количеством доступной оперативной памяти. Очевидно, чем больше массив, тем больше операций потребуется.
Я получил это отсюда на x64-битной системе: Python 3.7.0b5 (v3.7.0b5: abb8802389, май 31 2018, 01:54:01) [MSC V. 1913 64 бит (AMD64)] на win32
нет ограничений на номер списка. Основная причина, которая вызывает вашу ошибку, - это ОЗУ. Обновите размер памяти.