Python list максимальный размер

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

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

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

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

@Matt — количество байтов одного PyObject * . Это так называемый указатель (вы узнаете их по звездочке в конце). Указатели имеют длину 4 байта и хранят адрес памяти для выделенного объекта. Они имеют длину «всего» 4 байта, потому что с помощью 4 байтов вы можете адресовать каждый элемент в памяти современных компьютеров.

Стоит отметить (как указывает ответ Альваро Юстена), что на других машинах, особенно на тех, на которых работают 64-разрядные системы, значение PY_SSIZE_T_MAX can очень велико.

@ClydeTheGhost, не могли бы вы указать, могут ли те, на которых запущены 64-битные системы, также иметь меньший максимальный размер, чем 536 870 912 элементов? Или они могут сильно различаться, но всегда иметь максимальный размер, равный или превышающий 536 870 912 элементов?

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

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

>>> import sys >>> print sys.maxsize 9223372036854775807

9223372036854775807 элементов? В самом деле? Это также сильно отличается от ответа, получившего наибольшее количество голосов.

@akki принятый ответ относится к 32-битной системе. Поскольку сейчас 2016 год, я предполагаю, что вы используете 64-битную систему, и поэтому ответ правильный

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

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

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

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

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

Такой способ расчета времени может ввести в заблуждение — большую часть времени уходит на запуск интерпретатора Python. Лучший способ: python -m timeit.py «l = range (12000); l = sorted (l, reverse = True)». На моей машине это составляет примерно 1/20 времени для этого примера.

@dF, насчет точности ты прав. Спасибо, что заметили это. Я просто хотел доказать свою точку зрения. И пример это доказывает.

@dF: Замечательно! 0,024 с были для меня слишком долгими, и я рад, что теперь могу перестать об этом беспокоиться.

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

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

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

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

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

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

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

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

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

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

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

В целом верно, но не все из них — добавление остается амортизированным постоянным временем, независимо от размера массива.

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

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

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

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

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

Источник

Python. Сколько элементов можно положить в список?

Tomio

Но всё так или иначе упрётся в ресурсы вашего компьютера) А именно в память.

Tomio

ldmitriy, смотрите, я для эксперимента заполнил список из 500млн записей

5dc53dce5b51e113773984.png

у меня на это ушло где-то ~3гб оперативки. Плюс у меня каждый элемент списка — это строка из 5 символов. У вас же это может быть абсолютно рандомный список из элементов разной длины. Поэтому может и не хватать оперативки, конечно

ldmitriy,
Допустим у вас 32-битная ОС.
Список, в отличие от массива, устроен таким образом, что в самом списке хранятся только адреса (из 32-битного адресного пространства) расположения самих данных. При этом, хранить в памяти нужно и адреса (элементы списка), и сами данные.
Так вот, при создании списка, например, с 2,147,483,647 элементами только для хранения элементов списка (адресов) потребуется не менее 2,147,483,647 x 32 = 68,719,476,736 бит памяти, или 8,589,934,592 байт = 8 ГБ.
А ведь ещё нужно хранить сами данные. И не нужно забывать, что запущенный софт на машине тоже требует для своей работы память.

Максим, это очень интересно. Попробовал Ваш пример и у меня вылетела memory error.
А как определили что ушло ~3гб оперативки? Через диспетчер?

Максим, 500_000_000 x 4 байт = 2 ГБ. Что-то похоже. Получается, у вас 32-битная ОС или интерпретатор?

Tomio

ldmitriy, да, через мониторинг системы. Просто открыл и наблюдал)
Иван Мельников, нее, я просто ограничил. Первый раз запустил без ограничений, у меня съелось 18гб памяти)) и я прервал этот процесс, даже не смотрел, сколько туда влезло элементов.

Кол-во элементов списка ограничивается только доступным объемом ОЗУ.
Допустим у вас 32-битная ОС.
Список, в отличие от массива, устроен таким образом, что в самом списке хранятся только адреса (из 32-битного адресного пространства) расположения самих данных. При этом, хранить в памяти нужно и адреса (элементы списка), и сами данные.
Так вот, при создании списка, например, с 2,147,483,647 элементами только для хранения элементов списка (адресов) потребуется не менее 2,147,483,647 x 32 = 68,719,476,736 бит памяти, или 8,589,934,592 байт = 8 ГБ.
А ведь ещё нужно хранить сами данные. И не нужно забывать, что запущенный софт на машине тоже требует для своей работы память.
ps. Массивы гораздо эффективнее используют память, но есть ограничение – все элементы массива имеют единый заранее определенный тип.

Источник

Насколько большим может стать список 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 элементов.

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

Зачем был создан сайт sizeof(PyObject*) == 4? ? Что это собой представляет? — Мэтт

@Matt — количество байтов одного PyObject * . Это так называемый указатель (вы узнаете их по звездочке в конце). Указатели имеют длину 4 байта и хранят адрес памяти для выделенного объекта. Они имеют длину «всего» 4 байта, потому что с 4 байтами вы можете адресовать каждый элемент в памяти современных компьютеров. — Антонио Раганьен

Стоит отметить (как указывает ответ Альваро Юстена), что на других машинах, особенно на тех, на которых работают 64-битные системы, значение PY_SSIZE_T_MAX может очень сильно. — Клайд

@ClydeTheGhost, не могли бы вы указать, могут ли те, на которых запущены 64-битные системы, также иметь меньший максимальный размер, чем 536,870,912 536,870,912 XNUMX элементов? Или что они могут сильно различаться, но всегда иметь максимальный размер, равный или превышающий XNUMX XNUMX XNUMX элементов? — в

@at Максимум для 64-битной системы всегда будет равен или больше, чем для 32-битной системы. — Клайд

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

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

>>> import sys >>> print sys.maxsize 9223372036854775807 

@ldgorman, sys.maxsize это ответ на вопрос. Разные архитектуры поддерживают разные максимумы. — Саймон Куанг

9223372036854775807 элементов? Действительно? Это также сильно отличается от ответа, получившего наибольшее количество голосов. — Акки

@akki принятый ответ относится к 32-битной системе. Поскольку сейчас 2016 год, я предполагаю, что вы используете 64-битную систему, и поэтому ответ правильный — Брайан Лич

Это должен быть выбранный ответ. — Lokesh

Sys.maxsize должен дать вам 2 ^ 31-1 на 32-битной платформе и 2 ^ 63-1 на 64-битной платформе. (2147483647 или 9223372036854775807 соответственно) Однако, поскольку каждый указатель в 32-битном списке занимает 4 байта, а в 64-битном — 8 байтов, Python выдаст вам ошибку, если вы попытаетесь сделать список больше, чем maxsize / 8 на 64-битная система или maxsize / 4 в 32-битной системе. — thorr18

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

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

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

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

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

Такой способ определения времени может ввести в заблуждение — большую часть времени уходит на запуск интерпретатора Python. Лучший способ: python -m timeit.py «l = range (12000); l = sorted (l, reverse = True)». На моей машине это составляет примерно 1/20 времени для этого примера. — дФ.

@dF, насчет точности вы правы. Спасибо, что заметили это. Я просто хотел доказать свою точку зрения. И пример это доказывает. — Надя Алрамли

@dF: Замечательно! 0.024 с были для меня слишком долгими, и я рад, что теперь могу перестать об этом беспокоиться. — Томас Эдлесон

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

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

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

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

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

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

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

Источник

Читайте также:  Знак копирайта в HTML
Оцените статью