Tamaño de un array vs. tamaño de una variable en Python

Un poco de fondo antes de mi pregunta. Me encontré con esto mientras refactoría un juego de Tetris.

Representar una pieza de Tetris se puede hacer de las siguientes maneras (utilizaré la forma 'L' como ejemplo):

una variedad de booleanos:

boolShape = [False, False, False, False,
             False, True, True, False,
             False, False, True, False,
             False, False, True, False]

una serie de chars (Supongo 'estrings of length 1' ya que este es Python):

charShape = ['.', '.', '.', '.',
             '.', 'X', 'X', '.',
             '.', '.', 'X', '.',
             '.', '.', 'X', '.']

un array de ints:

intShape = [0, 0, 0, 0,
            0, 1, 1, 0,
            0, 0, 1, 0,
            0, 0, 1, 0]

a numpy array of ints:

npShape = np.array([0, 0, 0, 0,
                    0, 1, 1, 0,
                    0, 0, 1, 0,
                    0, 0, 1, 0])

un conjunto numposo de booleanos:

npBoolShape = np.array([0, 0, 0, 0,
                        0, 1, 1, 0,
                        0, 0, 1, 0,
                        0, 0, 1, 0], dtype=bool)

Cuando uso sys.getsizeof(array) y sys.getsizeof(array[i]) para conseguir el tamaño de cada matriz y de un solo elemento, obtengo lo siguiente:

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. ¿Puede alguien explicar por qué un char individual es más grande que un int pero un array de 20 es el mismo tamaño que 20 ints?

  2. ¿Importa alguna diferencia en términos de rendimiento para implementar el juego en uno de los arrays descritos anteriormente? No hace diferencia para un jugador humano, pero, para entrenar una AI, se necesitan muchas iteraciones y el tiempo se convierte en un problema.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por phpphoenix


2 Respuestas:

    • En Python, el tamaño de un objeto en memoria puede variar dependiendo del tipo de dato que almacene y de cómo esté representado internamente. En el caso de los caracteres individuales y los enteros, la diferencia en el tamaño puede deberse a la forma en que Python representa internamente esos datos. En algunos casos, los caracteres individuales pueden ocupar más memoria que los enteros debido a la forma en que se almacenan.

    Por otro lado, en el caso de un array de 20 elementos, el tamaño total suele ser la suma de los tamaños de cada elemento multiplicado por la cantidad de elementos en el array. Por lo tanto, un array de 20 enteros ocupará una cantidad de memoria igual a 20 veces el tamaño de un entero individual.

    • En cuanto al rendimiento, la elección del tipo de estructura de datos puede influir en la eficiencia de la ejecución del programa. En general, los arrays de tipos numéricos suelen ser más eficientes en términos de memoria y procesamiento en comparación con otros tipos de datos como strings o booleanos.

    Al utilizar bibliotecas como NumPy, que están optimizadas para trabajar con arrays numéricos, es posible que se obtengan mejoras significativas en el rendimiento en comparación con otros tipos de estructuras de datos. Para entrenar una inteligencia artificial que requiere muchas iteraciones, elegir la estructura de datos adecuada puede impactar en la velocidad de ejecución y en la eficiencia del algoritmo.

    En resumen, para mejorar el rendimiento de tu juego Tetris o de la AI, es recomendable utilizar estructuras de datos numéricas optimizadas como arrays de enteros o arrays de NumPy.

    Respondida el Dec 20, 2020 a las 00:47 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • 1. ¿Puede alguien explicar por qué un char individual es más grande que un int pero un array de 20 es el mismo tamaño que 20 ints?

    Esto se debe al relleno interno de los objetos en Python. Cada objeto en Python ocupa un espacio de memoria específico, incluso si no se utilizan todos los bytes. En el caso de los caracteres, Python utiliza un tipo de datos Unicode que ocupa 2 bytes por carácter. Por otro lado, los enteros ocupan solo 1 byte.

    Sin embargo, cuando se trata de arreglos, Python asigna un bloque contiguo de memoria para los elementos del arreglo. Por lo tanto, incluso si los elementos individuales son más pequeños (como los enteros), el relleno interno requerido para el arreglo aún puede resultar en un tamaño general más grande.

    2. ¿Importa alguna diferencia en términos de rendimiento para implementar el juego en uno de los arrays descritos anteriormente?

    En términos de rendimiento, el tipo de datos del arreglo puede tener un impacto notable, especialmente para grandes cantidades de datos. Aquí hay una descripción general de cada tipo de datos y su impacto potencial:

    Booleanos: Los arreglos booleanos son los más eficientes en términos de espacio, ya que cada elemento ocupa solo 1 bit. Sin embargo, pueden ser más lentos en operaciones como comparaciones y operaciones lógicas. Caracteres: Los arreglos de caracteres son relativamente eficientes en espacio y tiempo. Son adecuados para almacenar texto o datos categóricos. Enteros: Los arreglos de enteros son eficientes en espacio y rápidos para operaciones aritméticas. Sin embargo, pueden requerir más espacio que los booleanos o caracteres. Arreglos NumPy: Los arreglos NumPy están optimizados para operaciones numéricas y científicas. Ofrecen un alto rendimiento para cálculos complejos. Sin embargo, pueden ocupar más espacio que los tipos de datos integrados. Arreglos booleanos NumPy:* Los arreglos booleanos NumPy son similares a los arreglos booleanos estándar, pero están optimizados para operaciones NumPy. Ofrecen un buen equilibrio entre eficiencia de espacio y rendimiento.

    En el contexto de un juego de Tetris, el rendimiento del tipo de datos del arreglo probablemente no sea un factor crítico para la jugabilidad humana. Sin embargo, para entrenar una IA con muchas iteraciones, elegir un tipo de datos eficiente como los booleanos o los enteros puede mejorar la velocidad de entrenamiento.

    Respondida el Dec 20, 2020 a las 00:58 - por Gemini

    Votos positivos: 0 | Votos negativos: 0