Максимальная длина list python

Насколько большим может стать список 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 это ответ на вопрос. Разные архитектуры поддерживают разные максимумы. — Саймон Куанг

Читайте также:  Java операция арифметические операции

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 ограничена только объемом памяти в вашей системе.

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

Читайте также:  Php ini not being read

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

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

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

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

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

Источник

Как создать список с определенным размером на Python

Как создать список с определенным размером на Python

  1. Предварительное размещение хранилища для списков
  2. Предварительное выделение хранилища для других последовательных структур данных

Предварительное выделение хранилища для списков или массивов — типичный шаблон среди программистов.
когда они заранее знают количество элементов.

В отличие от C++ и Java, в Python, вы должны инициализировать все ваше предварительно распределенное хранилище некоторыми значениями.
Обычно разработчики используют для этого ложные значения, такие как None , «» , False и 0 .

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

Для сравнения характеристик различных подходов мы будем использовать стандарт Python
модуль timeit .
Он предоставляет удобный способ измерения времени выполнения небольших фрагментов кода Python.

Читайте также:  Типы php как объекты

Предварительное размещение хранилища для списков

Первый и самый быстрый способ использования оператора * , который повторяет список указанных
несколько раз.

>>> [None] * 10 [None, None, None, None, None, None, None, None, None, None] 

Миллион итераций (значение итераций по умолчанию в timeit ) занимает приблизительно
117 мс.

>>> timeit("[None] * 10") 0.11655918900214601 

Другой подход — использование встроенной функции range с пониманием списка.

>>> [None for _ in range(10)] [None, None, None, None, None, None, None, None, None, None] 

Она почти в шесть раз медленнее и занимает 612 мс в секунду на миллион итераций.

>>> timeit("[None for _ in range(10)]") 0.6115895550028654 

Третий подход — использование простого цикла for вместе с list.append() .

>>> a = [] >>> for _ in range(10): . a.append(None) . >>> a [None, None, None, None, None, None, None, None, None, None] 

Источник

Оцените статью