Наскільки великий Python може отримати список? Мені потрібен список з приблизно 12000 елементів. Чи зможу я все-таки запускати методи списку, такі як сортування тощо?
Наскільки великий Python може отримати список? Мені потрібен список з приблизно 12000 елементів. Чи зможу я все-таки запускати методи списку, такі як сортування тощо?
Відповіді:
Відповідно до вихідного коду , максимальний розмір списку - це 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 елементів.
Поки кількість елементів у вас дорівнює або нижче, всі функції списку повинні працювати правильно.
PyObject *
. Ця річ - так званий покажчик (ви розпізнаєте їх через зірочку в кінці). Покажчики завдовжки 4 байти і зберігають адресу пам'яті на виділеному об'єкті. Вони мають "лише" 4 байти, оскільки за допомогою 4-х байтів ви можете звертатися до кожного елемента в пам'яті комп’ютерів, які сьогодні є.
PY_SSIZE_T_MAX
може дуже сильно.
Як говориться в документації Python :
sys.maxsize
Найбільше позитивне ціле число, що підтримується типом Py_ssize_t платформи, і таким чином можуть мати списки максимального розміру, рядки, дикти та багато інших контейнерів.
У моєму комп’ютері (Linux x86_64):
>>> import sys
>>> print sys.maxsize
9223372036854775807
sys.maxsize
це відповідь на запитання. Різні архітектури підтримують різні максимуми.
Звичайно, це нормально. Насправді ви легко переконаєтесь у цьому:
l = range(12000)
l = sorted(l, reverse=True)
Запуск цих рядків на моїй машині зайняв:
real 0m0.036s
user 0m0.024s
sys 0m0.004s
Але впевнений, як усі інші сказали. Чим більший масив, тим повільніше будуть операції.
У випадковому коді я створив списки з мільйонами елементів. Я вважаю, що реалізація списків Python обмежена лише кількістю пам'яті у вашій системі.
Крім того, методи / функції списку повинні продовжувати працювати, незважаючи на розмір списку.
Якщо ви дбаєте про продуктивність, можливо, варто заглянути в бібліотеку, таку як NumPy .
Характеристики продуктивності списків описані на Effbot.
Списки Python реально реалізовані як векторні для швидкого випадкового доступу, тому контейнер в основному вміщує стільки предметів, скільки є місця для пам'яті. (Вам потрібен простір для покажчиків, що містяться у списку, а також простір у пам'яті для об’єкта (ів), на який вказують.)
Додавання є O(1)
(амортизована постійна складність), однак для вставки / видалення з середини послідовності знадобиться O(n)
(лінійна складність) переупорядкування, яке стане повільнішим за кількістю елементів у вашому списку.
Ваше запитання щодо сортування є більш нюансованим, оскільки операція порівняння може зайняти необмежену кількість часу. Якщо ви виконуєте дійсно повільні порівняння, це займе багато часу, хоча це не є видом списку даних Python .
Повернення просто займає кількість часу, яке потрібно для зміни всіх покажчиків у списку (обов'язково O(n)
(лінійна складність), оскільки ви торкаєтесь кожного вказівника один раз).
Він змінюється для різних систем (залежить від оперативної пам'яті). Найпростіший спосіб це дізнатися
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
Не існує обмеження номера списку. Основна причина, що викликає вашу помилку, - оперативна пам’ять. Обновіть розмір пам’яті.
sizeof(PyObject*) == 4?
? Що це являє собою?