Article

Explorando la Memoria en Python: Entendiendo Aliasing, Mutabilidad e Inmutabilidad

5 min min leído

Publicado el 2 de febrero de 2024

Explorando la Memoria en Python: Entendiendo Aliasing, Mutabilidad e Inmutabilidad

Introducción

Al implementar soluciones como Data Scientist, es común enfrentarse a obstáculos relacionados con la gestión de memoria en Python. Por esta razón, este artículo abordará el tema del manejo de la memoria en Python. Se explorará cómo la asignación de variables afecta a la memoria y cómo comprender este proceso puede optimizar la eficiencia del código, reducir el tiempo empleado y prevenir situaciones frustrantes. Además, se examinarán diversos tipos de variables, desde cadenas hasta tuplas, con el fin de comprender mejor cómo Python gestiona la memoria en diferentes contextos.

En un contexto donde la privacidad del usuario se vuelve cada vez más crucial y los cambios tecnológicos y regulaciones refuerzan el control por parte de los usuarios, se hace necesario ajustar el entorno digital para mitigar la pérdida de datos.

En este escenario de creciente escasez de datos, Google presenta Consent Mode, una solución que gana relevancia, especialmente con su carácter obligatorio en su implementación básica a partir de marzo de 2024. En JAKALA, ya brindamos apoyo para que nuestros clientes adapten sus ecosistemas a estas transformaciones y demandas de privacidad.

Es esencial tener en cuenta que Consent Mode no funciona como una Plataforma de Gestión de Consentimientos (CMP). La funcionalidad ofrecida por estos para la gestión de consentimientos, como el aviso de cookies y el registro de dichos consentimientos, sigue siendo proporcionada a través de nuestro CMP.

Consent mode nos ofrece una alternativa para seguir registrando eventos y conversiones de usuarios que rechazan cookies. Su función principal es adaptar dinámicamente el comportamiento de las etiquetas de Analytics, Google Ads y terceros en función del consentimiento otorgado. En caso de que el usuario deniegue, las etiquetas envían pings o señales al servidor de Google sin cookies. 

 

Estos pings se dividen en tres tipos:

Qué entendemos por memoria

Se puede pensar en la memoria de un ordenador como un libro vacío listo para ser ocupado con pequeñas historias. En este libro, aún no hay nada escrito, pero eventualmente, diferentes autores llegarán, cada uno deseando un pedazo de espacio para escribir su propia historia.

Dado que los autores no pueden escribir sobre el trabajo de otros, deben ser cuidadosos con las páginas en las que escriben. Antes de comenzar a escribir, consultan al dueño del libro, quien decide dónde pueden escribir.

Screenshot 2024-02-05 174239

Con el tiempo, muchas historias se dejan de leer o consultar, cuando esto ocurre, son eliminadas para liberar espacio.

En este ejemplo los "autores" representan las diferentes aplicaciones o procesos que necesitan almacenar datos en la memoria-libro. El "dueño" desempeña el papel de un administrador de memoria, decidiendo dónde pueden escribir los autores. Y el "recolector de basura" elimina las historias antiguas.

En este artículo nos vamos a poner en la piel de Python, enfocándonos en una sección particular de las cosas que registra en el libro: los objetos.

Es fundamental destacar que, al elegir esta opción, Google no recopilará ningún tipo de dato para aquellos usuarios que hayan rechazado cookies. En este escenario, las funcionalidades de conversion modeling se basarán únicamente en el comportamiento observado, específicamente en la información funcional recopilada en los datos observados, como el tipo de navegador, tipo de conversión, país, hora del día, u otras variables no identificables a alto nivel.

Sin embargo, si buscamos aprovechar el modelado de comportamiento y recopilar pings, y con ello eventos de aquellos usuarios que han rechazado cookies, enriqueciendo así nuestro conocimiento, debemos optar por la implementación avanzada. En este caso, las etiquetas de Google se cargarán antes de que aparezca el banner de consentimiento, enviando un ping para informar que hay una visita. Una vez aprobadas o rechazadas las cookies, desplegará una cookie en caso de aceptar, o continuará enviando solo los pings y eventos sin cookies en caso de rechazar.

El funcionamiento sería por tanto el siguiente:

Aliasing

Cuando se crea una variable en Python, se está esencialmente escribiendo el contenido de esa variable en una página del libro (es decir, creando un objeto) y luego vinculando ese contenido al nombre de la variable. Por ejemplo, al ejecutar:

Ahora bien, ¿qué tipo de información se envía en el caso de que el usuario rechace cookies y, por tanto, se envíe un Ping? Google nos proporciona los siguientes detalles:

  • Información funcional: marca de tiempo, user-agent y la url referente.
  • Información agregada o no identificable:
    Indicación sobre si el usuario ha              accedido por una página con el parámetro gclid/dclid y por tanto   proviene de un anuncio.
    2. Información booleana sobre el estado de consentimiento.
    3. Número aleatorio generado en cada carga de página.
    4. Información sobre la plataforma de consentimiento que emplea la web.
  • Además, en el caso en el que se hayan definido otros campos, como el user_id, o dimensiones personalizadas estos se enviarán con normalidad. Lo mismo ocurre con los parámetros de comercio electrónico.

Todos estos datos recopilados a través de los pings sin cookies son los que Google utilizará para completar la información que le falte.

 En resumen, las implicaciones de optar por una implementación o otra se traducen en las siguientes ventajas al contar con la implementación avanzada de consent mode:

  • Aumento del volumen total de datos recibidos: Esto contribuye a mejorar la calidad de nuestras métricas y nos proporciona una visión más precisa y cercana a la realidad de nuestro negocio.
  • Capacidad de rellenar los huecos con el modelado: Gracias a esta funcionalidad, somos capaces de llenar los vacíos dejados por los usuarios que no han aceptado cookies. Esto nos permite inferir datos que no se han recopilado directamente, enriqueciendo así nuestro conjunto de información

 

Screenshot 2024-02-19 132238

Lo que se escribe en el libro es: “Este artículo es la leche”, y se le asigna a string una dirección para encontrar su contenido. Esta dirección es lo que se denomina referencia. 

El lugar donde Python va guardando estos objetos según vamos ejecutando (runtime) el código es la memoria RAM (una sección del libro).

Sin embargo, Python tiene una característica inteligente: cuando creamos otra variable y la igualamos a una que ya existe, en lugar de escribir nuevo texto en el libro (es decir, crear otro objeto), simplemente asigna la nueva variable al texto que ya existe (compartiendo la misma referencia).

Gráficamente:

Screenshot 2024-02-19 132349
Screenshot 2024-02-05 174708

Para ahorrar espacio, cuando se crea la variable lista_2 asignándola a la variable lista_1, no se duplica el contenido en el libro; en su lugar, lista_2 se vincula al mismo lugar del libro donde está escrito el contenido de lista_1.

Este es el fenómeno que se conoce como Aliasing.

Si se modifica el valor de lista_2 también se modifica el de lista_1. Esto sucede porque ambos nombres (variables) comparten la misma referencia, por lo que cualquier modificación que se haga en uno de ellos afectará al otro (simplemente se modifica el texto escrito en el libro).

Screenshot 2024-02-19 132538

Sin embargo, si después de establecer lista_1 igual a lista_2, se asigna lista_2 a otra lista diferente, lista_1 no se verá afectada.

Screenshot 2024-02-19 132616

 

Esto ocurre porque al hacer lista_2 = [“casa”] se crea un nuevo objeto y las dos variables dejan de tener la misma referencia.

 

Veamos otro ejemplo:

Screenshot 2024-02-19 132650

De manera similar al caso anterior, a num_2 se le asigna la misma referencia que a num_1. Sin embargo, a diferencia del caso de las listas, al modificar el valor de num_2, no se modifica el valor de num_1. ¿Cómo es posible esto?

Este es el quid de la cuestión del punto 4. Aunque el fenómeno del Aliasing ocurre siempre, modificar una variable modifica la otra sólo si la variable original es de tipo 'mutable'.

Mutabilidad e Inmutabilidad

Los diferentes tipos de Python se pueden organizar en función de su “mutabilidad”. Pueden ser:

  • Mutables: Si se pueden modificar una vez creados.
  • Inmutables: Si no se pueden modificar una vez creados.

Cuando se habla de que una variable no se puede modificar, nos referimos a que, para cambiar su contenido, se debe crear un nuevo objeto (escribir en una nueva página del libro) obligando a cambiar su referencia.

Un ejemplo de los tipos mutables más comunes son los siguientes:

  • Listas
  • Diccionarios
  • Sets
  • Clases creadas por el usuario
  • DataFrame (Pandas)

Y tipos inmutables:

  • Booleanos
  • Complejos, enteros, flotantes
  • Cadenas de texto
  • Tuplas
  • Frozensets
  • DataFrame (Polars)

Es fundamental comprender cada grupo para evitar comportamientos inesperados en el código. Regresando al símil del libro, esto sería lo que ocurre visualmente:

  • Se crea una variable cualquiera var1 y hacemos var1 = var2.
Screenshot 2024-02-05 175532

Implicaciones

A partir de marzo, resultará crucial contar, al menos, con la implementación básica de consent mode. Esta elección permitirá que los servidores de Google dispongan de información acerca del estado de consentimiento de los usuarios, ajustando así sus etiquetas para continuar ingresando los datos consentidos de los clientes. En caso de no implementarla, a partir de marzo dejaríamos de recopilar audiencias en un primer momento, y posteriormente, las conversiones.

Si deseas obtener más detalles sobre cómo iniciar la explotación de la implementación avanzada de consent mode, así como aprender a visualizar datos modelados en GA4 y comprender las diferencias entre los datos de GA4 y Bigquery, permanece atento a nuestro próximo post.

 

Si var1 es mutable y se modifica cualquiera de las dos:

Screenshot 2024-02-05 175625

Si var1 es inmutable y se modifica var2:

Screenshot 2024-02-05 175719

Si var1 es inmutable y se modifica:

Screenshot 2024-02-05 175812

Si se tiene una variable mutable y se quiere que se comporte como una inmutable, se necesita usar la función copy() antes de igualarlas:

Screenshot 2024-02-19 133046

De esta manera, se consigue que la referencia asignada a lista_1 sea diferente de la asignada a lista_2, y modificar una no afecta a la otra.

Además, existe un caso curioso que merece ser destacado:

Screenshot 2024-02-19 133157

En este ejemplo se tiene una tupla (inmutable) compuesta por varios elementos donde uno de ellos es una lista (mutable). Aunque parezca que lo que se ha modificado es la tupla, lo que en realidad se modifica es la lista, es decir, se ha modificado una parte mutable dentro de un objeto inmutable, y la referencia no cambia.

Cabe destacar también algunas propiedades y características de estos tipos:

  • Los tipos inmutables pueden ser costosos de cambiar, ya que cada modificación implica hacer una copia del contenido en un nuevo objeto.
  • Los tipos mutables son ideales cuando se quiere cambiar su contenido de forma repetida.
  • Los tipos inmutables son generalmente más rápidos de acceder. Por lo que, si no se piensa modificar una lista en un código, es mejor usar una tupla.

Conclusiones

En resumen, se han explorado conceptos fundamentales sobre el funcionamiento de la memoria en un ordenador y en Python, comprendiendo el término de "Aliasing" y su relación con la mutabilidad e inmutabilidad de las variables en Python. 

Esta introducción a la gestión de memoria en Python representa un desafío a tener en cuenta al crear soluciones de alto nivel en machine learning e inteligencia artificial.

Elaborado por: Juan García Vega, Data Scientist

Perspectivas

Explorando la Memoria en Python: Entendiendo Aliasing, Mutabilidad e Inmutabilidad
Article

Explorando la Memoria en Python: Entendiendo Aliasing, Mutabilidad e Inmutabilidad

5 min min leído
¡Feliz Cumpleaños, JAKALA!
Article

¡Feliz Cumpleaños, JAKALA!

4 min min leído
Consent Mode: La solución de Google al futuro de la privacidad digital | Capítulo 2
Article

Consent Mode: La solución de Google al futuro de la privacidad digital | Capítulo 2

5 min leído
Consent Mode: La solución de Google al futuro de la privacidad digital | Capítulo 1
Article

Consent Mode: La solución de Google al futuro de la privacidad digital | Capítulo 1

5 min leído