Насколько большой может получить список Python? - PullRequest
99 голосов
/ 13 мая 2009

Насколько велик список в Python? Мне нужен список около 12000 элементов. Смогу ли я по-прежнему запускать методы списка, такие как сортировка и т. Д.

Ответы [ 10 ]

173 голосов
/ 13 мая 2009

Согласно исходному коду максимальный размер списка составляет 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 элементов.

Пока количество элементов у вас равно или меньше, все функции списка должны работать правильно.

47 голосов
/ 01 апреля 2013

Как сказано в документации Python :

sys.maxsize

Наибольшее положительное целое число, поддерживаемое типом платформы Py_ssize_t, и, таким образом, может иметь списки максимального размера, строки, подсказки и многие другие контейнеры.

На моем компьютере (Linux x86_64):

>>> import sys
>>> print sys.maxsize
9223372036854775807
26 голосов
/ 13 мая 2009

Конечно, все в порядке. На самом деле вы можете легко убедиться в этом:

l = range(12000)
l = sorted(l, reverse=True)

Выполнение этих строк на моей машине заняло:

real    0m0.036s
user    0m0.024s
sys  0m0.004s

Но конечно, как и все остальные. Чем больше массив, тем медленнее будут операции.

6 голосов
/ 13 мая 2009

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

Кроме того, методы / функции списка должны продолжать работать, несмотря на размер списка.

Если вы заботитесь о производительности, возможно, стоит поискать такую ​​библиотеку, как NumPy .

5 голосов
/ 13 мая 2009

Характеристики производительности для списков описаны в Effbot.

Списки Python фактически реализованы как вектор для быстрого произвольного доступа, поэтому контейнер будет в основном содержать столько элементов, сколько есть места в памяти. (Вам нужно место для указателей, содержащихся в списке, а также место в памяти для объектов, на которые указывают объекты.)

Аппендинг равен O(1) (амортизированная постоянная сложность), однако для вставки / удаления из середины последовательности потребуется переупорядочение O(n) (линейная сложность), которое будет медленнее по мере количества элементов в вашем списке .

Ваш вопрос сортировки более нюансированный, поскольку операция сравнения может занимать неограниченное количество времени. Если вы выполняете очень медленные сравнения, это займет много времени, хотя это и не ошибка Тип данных списка Python .

Обращение просто занимает количество времени, необходимое для замены всех указателей в списке (обязательно O(n) (линейная сложность), поскольку вы касаетесь каждого указателя один раз).

5 голосов
/ 13 мая 2009

12000 элементов - это ничто в Python ... и на самом деле количество элементов может доходить до того, что интерпретатор Python имеет память в вашей системе.

1 голос
/ 28 декабря 2018

Различно для разных систем (зависит от оперативной памяти). Самый простой способ узнать это

import six six.MAXSIZE 9223372036854775807 Это дает максимальный размер list и dict тоже, согласно документации

1 голос
/ 13 мая 2009

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

0 голосов
/ 08 июня 2018

Я получил это здесь на 64-битной системе: Python 3.7.0b5 (v3.7.0b5: abb8802389, 31 мая 2018, 01:54:01) [MSC v.1913 64 бит (AMD64)] на win32

enter image description here

0 голосов
/ 07 марта 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...