Наскільки великий може отримати список Python?


119

Наскільки великий Python може отримати список? Мені потрібен список з приблизно 12000 елементів. Чи зможу я все-таки запускати методи списку, такі як сортування тощо?

Відповіді:


193

Відповідно до вихідного коду , максимальний розмір списку - це PY_SSIZE_T_MAX/sizeof(PyObject*).

PY_SSIZE_T_MAXвизначено в pyport.h, який буде((size_t) -1)>>1

У звичайній 32-бітовій системі це (4294967295/2) / 4 або 536870912.

Тому максимальний розмір списку пітонів у 32-бітовій системі становить 536 870 912 елементів.

Поки кількість елементів у вас дорівнює або нижче, всі функції списку повинні працювати правильно.


4
Чому так sizeof(PyObject*) == 4?? Що це являє собою?
Метт

4
@Matt - це кількість байтів одиничного PyObject *. Ця річ - так званий покажчик (ви розпізнаєте їх через зірочку в кінці). Покажчики завдовжки 4 байти і зберігають адресу пам'яті на виділеному об'єкті. Вони мають "лише" 4 байти, оскільки за допомогою 4-х байтів ви можете звертатися до кожного елемента в пам'яті комп’ютерів, які сьогодні є.
Антоніо Рагагнін

1
Варто зазначити (як свідчить відповідь Альваро Юстен), що для інших машин, зокрема для 64-бітових систем, цінність PY_SSIZE_T_MAXможе дуже сильно.
ClydeTheGhost

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

1
@at Максимум для 64-бітної системи завжди буде рівним або більшим, ніж для 32-бітної системи.
ClydeTheGhost

71

Як говориться в документації Python :

sys.maxsize

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

У моєму комп’ютері (Linux x86_64):

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

як це відповідає на запитання
ldgorman

11
@ldgorman, sys.maxsizeце відповідь на запитання. Різні архітектури підтримують різні максимуми.
Саймон Куанг

2
9223372036854775807 елементи? Дійсно? Це сильно відрізняється від відповіді, що найбільш схвалюється.
аккі

13
@akki прийнята відповідь посилається на 32-бітну систему. Оскільки це 2016 рік, я припускаю, що ви працюєте на 64-бітній системі, тому відповідь правильна
Брайан Ліч

2
Це має бути обрана відповідь.
Lokesh

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 = діапазон (12000); l = відсортований (l, зворотний = True)". На моїй машині це дає приблизно 1/20 часу для цього прикладу.
dF.

5
@dF, ви праві щодо точності. Дякую, що зауважив це Я просто хотів довести свою точку. І приклад це доводить.
Надя Алрамлі

13
@dF: Дивовижно! 0,024s був для мене занадто довгим, і я радий, що можу перестати турбуватися про це зараз.
Томас Едлсон

6

У випадковому коді я створив списки з мільйонами елементів. Я вважаю, що реалізація списків Python обмежена лише кількістю пам'яті у вашій системі.

Крім того, методи / функції списку повинні продовжувати працювати, незважаючи на розмір списку.

Якщо ви дбаєте про продуктивність, можливо, варто заглянути в бібліотеку, таку як NumPy .


5

Характеристики продуктивності списків описані на Effbot.

Списки Python реально реалізовані як векторні для швидкого випадкового доступу, тому контейнер в основному вміщує стільки предметів, скільки є місця для пам'яті. (Вам потрібен простір для покажчиків, що містяться у списку, а також простір у пам'яті для об’єкта (ів), на який вказують.)

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

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

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


4

12000 елементів - це ніщо в Python ... і насправді кількість елементів може переходити настільки, наскільки інтерпретатор Python має пам'ять у вашій системі.


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

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


1
Це було б чудовою відповіддю, якби ви трохи розширили деталі та як інші могли знайти свій власний ліміт.
Шаяан

-16

Не існує обмеження номера списку. Основна причина, що викликає вашу помилку, - оперативна пам’ять. Обновіть розмір пам’яті.


9
-1 тому, що він насправді не відповідає на питання, а насправді вводить в оману, оскільки (як показано в інших відповідях) список дійсно має максимальний розмір.
ClydeTheGhost
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.