Насколько большой может получить список 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

Я бы сказал, что вы ограничены только общим объемом доступной оперативной памяти. Очевидно, что чем больше массив, тем дольше будут выполняться операции с ним.

Нет ограничений по номеру списка. Основная причина, которая вызывает вашу ошибку - это оперативная память. Пожалуйста, обновите ваш объем памяти.

Другие вопросы по тегам