Размер массива в зависимости от размера переменной в Python

#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
 
  1. Кто-нибудь может объяснить, почему отдельный символ больше, чем int, но массив из 20 имеет тот же размер, что и 20 целых чисел?
  2. Имеет ли какое-либо значение с точки зрения производительности реализация игры в одном из массивов, описанных выше? Для игрока-человека это не имеет значения, но для обучения ИИ требуется много итераций, и время становится проблемой.

Комментарии:

1. getsizeof не включает размер элементов в a list , только саму list структуру.

2. Но для np.array него действительно включает содержимое.

3. Ваши измерения ненадежны для оценки потребления памяти. Я рекомендую измерить getsizeof('X') [50] и сравнить с getsizeof('XX') [51] . То же самое с увеличением list ints . Или сравните размер пустого np.array([]) [96] с np.array([1]) [100] . Граничные условия оказывают наибольшее влияние на ваши опубликованные результаты.