Найти - Пользователи
Полная версия: Сколько максимально элементов целого типа можно сохранить в списке?
Начало » Python для новичков » Сколько максимально элементов целого типа можно сохранить в списке?
1
ynos
Я новичок. Помогите разобраться
Следующий код выдает ошибку memory error
 x = []
for i in range(1000000000):
 x.append(i)

Сколько элементов можно сохранить в список и от чего зависит заполнение памяти?

python 3.7 x64/ubuntu 18.04/4Gb Ram
Rodegast
> Следующий код выдает ошибку memory error … Сколько элементов можно сохранить в список и от чего зависит заполнение памяти?

Я для прикола запустил у себя этот код, он отработал нормально и сожрал почти 40 ГиБ памяти. Выводы делай сам…
ynos
Rodegast
> Следующий код выдает ошибку memory error … Сколько элементов можно сохранить в список и от чего зависит заполнение памяти?Я для прикола запустил у себя этот код, он отработал нормально и сожрал почти 40 ГиБ памяти. Выводы делай сам…
У Вас 64гб RAM?
PEHDOM
ynos
Сколько элементов можно сохранить в список и от чего зависит заполнение памяти?
Заполнение памяти зависит, как ни странно, от того чем вы ее заполняете. Для списка из n элементов нужно n * <размер элемента> байтов. Для разных ОС, разных архитектур с разным количеством RAM и разных данных колличество элементов будет отличаться.(возможно даже что эта цифра будет разной для разных версий пайтона), и все упираеться в то сколько памяти сможет скушать ваш пайтон.
на моем компе в вашем варианте цикл останавливаеться на 67090194-м элементе, а если поменять код на
 x = [0]
for i in range(1000000000):
     x.append(x[0])
то цикл прерветься на 138753635 -м элементе(потому кака ссылка на элемент занимает меньше места)
И в том и в другом случае это произошло когда программа заняла порядка 1.3 гига памяти, но пайтон 32-х битный да и версии 3.2
Поставив версию 3.7x32 тот же код выдал MemoryError на
75476475-м и 175610084-м элементе при использовании памяти в 1.5 гига и 700 Мб соответствено.
как видно от версии к версии пайтона эти показатели также могут меняться.

Чтобы сказать точнее нужно копаться в сырцах пайтона… по идее оно должно быть завязано на константу PY_SSIZE_T_MAX
 if (new_allocated > (size_t)PY_SSIZE_T_MAX / sizeof(PyObject *)) {
PyErr_NoMemory();
https://github.com/python/cpython/blob/master/Objects/listobject.c
тоесть зависеть от операционки, ее разрядности, версии и разрядности пайтона и количества РАМы, но точную математику сейчас не приведу.
Rodegast
> У Вас 64гб RAM?

Да.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB