#python #arrays #types #size
#python #массивы #типы #размер
Вопрос:
Небольшая справка перед моим вопросом. Я наткнулся на это во время рефакторинга игры в Тетрис.
Представление фрагмента Тетриса может быть выполнено следующими способами (я буду использовать форму «L» в качестве примера):
массив логических значений:
boolShape = [False, False, False, False,
False, True, True, False,
False, False, True, False,
False, False, True, False]
массив символов (я думаю, «строки длиной 1», поскольку это Python):
charShape = ['.', '.', '.', '.',
'.', 'X', 'X', '.',
'.', '.', 'X', '.',
'.', '.', 'X', '.']
массив целых чисел:
intShape = [0, 0, 0, 0,
0, 1, 1, 0,
0, 0, 1, 0,
0, 0, 1, 0]
массив целых чисел:
npShape = np.array([0, 0, 0, 0,
0, 1, 1, 0,
0, 0, 1, 0,
0, 0, 1, 0])
числовой массив логических значений:
npBoolShape = np.array([0, 0, 0, 0,
0, 1, 1, 0,
0, 0, 1, 0,
0, 0, 1, 0], dtype=bool)
Когда я использую sys.getsizeof(array)
и sys.getsizeof(array[i])
для получения размера каждого массива и отдельного элемента, я получаю следующее:
Bool | Array: 184 | Item: 24
Char | Array: 184 | Item: 50
Int | Array: 184 | Item: 24
NP | Array: 224 | Item: 32
NPBool| Array: 112 | Item: 25
- Кто-нибудь может объяснить, почему отдельный символ больше, чем int, но массив из 20 имеет тот же размер, что и 20 целых чисел?
- Имеет ли какое-либо значение с точки зрения производительности реализация игры в одном из массивов, описанных выше? Для игрока-человека это не имеет значения, но для обучения ИИ требуется много итераций, и время становится проблемой.
Комментарии:
1.
getsizeof
не включает размер элементов в alist
, только самуlist
структуру.2. Но для
np.array
него действительно включает содержимое.3. Ваши измерения ненадежны для оценки потребления памяти. Я рекомендую измерить
getsizeof('X')
[50] и сравнить сgetsizeof('XX')
[51] . То же самое с увеличениемlist
ints
. Или сравните размер пустогоnp.array([])
[96] сnp.array([1])
[100] . Граничные условия оказывают наибольшее влияние на ваши опубликованные результаты.