Насколько большим может стать список Python?

120

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

посвященный
источник

Ответы:

193

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

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

неизвестный
источник
4
Почему sizeof(PyObject*) == 4?? Что это собой представляет?
Мэтт
4
@Matt - количество байтов одного PyObject *. Это так называемый указатель (вы узнаете их по звездочке в конце). Указатели имеют длину 4 байта и хранят адрес памяти для выделенного объекта. Они имеют длину «всего» 4 байта, потому что с помощью 4 байтов вы можете адресовать каждый элемент в памяти современных компьютеров.
Антонио Раганьин
1
Стоит отметить (как указывает ответ Альваро Юстена), что на других машинах, особенно на тех, на которых работают 64-разрядные системы, значение PY_SSIZE_T_MAXcan очень велико.
ClydeTheGhost 08
@ClydeTheGhost, не могли бы вы указать, могут ли те, на которых запущены 64-битные системы, также иметь меньший максимальный размер, чем 536 870 912 элементов? Или они могут сильно различаться, но всегда иметь максимальный размер, равный или превышающий 536 870 912 элементов?
на
1
@at Максимум для 64-битной системы всегда будет равен или больше, чем для 32-битной системы.
ClydeTheGhost
73

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

sys.maxsize

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

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

>>> import sys
>>> print sys.maxsize
9223372036854775807
Альваро Юстен
источник
как это отвечает на вопрос
ldgorman
11
@ldgorman, sys.maxsizeэто ответ на вопрос. Разные архитектуры поддерживают разные максимумы.
Саймон Куанг
2
9223372036854775807 элементов? В самом деле? Это также сильно отличается от ответа, получившего наибольшее количество голосов.
Akki
13
@akki принятый ответ относится к 32-битной системе. Поскольку сейчас 2016 год, я предполагаю, что вы используете 64-битную систему, и поэтому ответ правильный
Брайан Лич
2
Это должен быть выбранный ответ.
Локеш
26

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

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

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

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

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

Надя Алрамли
источник
20
Такой способ расчета времени может ввести в заблуждение - большую часть времени уходит на запуск интерпретатора Python. Лучший способ: python -m timeit.py "l = range (12000); l = sorted (l, reverse = True)". На моей машине это составляет примерно 1/20 времени для этого примера.
dF.
5
@dF, насчет точности ты прав. Спасибо, что заметили это. Я просто хотел доказать свою точку зрения. И пример это доказывает.
Надя Алрамли
13
@dF: Замечательно! 0,024 с были для меня слишком долгими, и я рад, что теперь могу перестать об этом беспокоиться.
Томас Эдлесон
6

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

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

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

Doug
источник
5

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

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

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

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

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

cdleary
источник
4

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

AlbertoPL
источник
3

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

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

Юнуса
источник
1
это не документация
Борис
1

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

Уэйн Коортс
источник
4
В целом верно, но не все из них - добавление остается амортизированным постоянным временем, независимо от размера массива.
cdleary
0

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

введите описание изображения здесь

user2063329
источник
1
Это был бы отличный ответ, если бы вы немного расширили детали и то, как другие могут найти свой собственный предел.
Shayaan
-16

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

Haimei
источник
9
-1, потому что на самом деле он не отвечает на вопрос и фактически вводит в заблуждение, потому что (как показывают другие ответы) список действительно имеет максимальный размер.
ClydeTheGhost 08