Por qué los conjuntos y diccionarios de Python no son realmente O(1)

Fuentes: Python sets and dictionaries can have quadratic-time performance

En Python se asume de forma generalizada que las estructuras dict y set ofrecen operaciones en tiempo constante, pero esa afirmación es un modelo simplificado, no una realidad garantizada. Un diccionario se implementa mediante una tabla hash, cuya eficiencia depende de una buena función de hash y de colisiones poco frecuentes. Sin embargo, basta con elegir valores adversarios para provocar un colapso de rendimiento: el autor demuestra que, al insertar números especialmente elegidos y luego verificar su pertenencia, el tiempo se cuadruplica cada vez que se duplica el tamaño de los datos, un comportamiento claramente cuadrático. Con cien mil elementos, construir el conjunto llega a tardar 45 segundos en una Apple M4 Max con Python 3.14.

El problema no se limita a colisiones. A medida que la estructura crece, los datos dejan de caber en la caché del procesador, pasan a la memoria RAM y, eventualmente, al disco, con costes de acceso progresivamente mayores. El autor lo ilustra comparando un dict[str, int] de un millón de claves con la librería fastconstmap, que almacena las claves y los valores en una representación compacta de 9 bytes por clave frente a unos 116 bytes del enfoque convencional. El resultado es que el dict estándar pasa de 22 a 202 nanosegundos por consulta al crecer, mientras que fastconstmap mantiene su velocidad gracias a una mejor localidad de caché.

La conclusión es práctica: el modelo O(1) es útil para enseñar, pero en producción hay que tener presentes los sesgos cognitivos que introduce y considerar aspectos como la localidad de memoria, el tipo de claves y el patrón de uso antes de elegir una estructura de datos.