Jugando con una biblioteca para hacer "datos sintéticos" con distribución aleatoria nos encontramos con la disyuntiva de eliminar información de miles de casos sobre una muestra que en algunos casos superaba el millón de registros.
Anteriormente lo solucioné usando simplemente el conocimiento empírico aprendido por años para lo cual se agregó un nuevo método llamado ListaIndices().
Donde se manda el tamaño total de la lista - tamlista (número de elementos SIN REPETIR) entre los límites denotados por el rango (lim1 y lim2).
Lo que pudiera ser un símil con la función sample() del lenguaje de programación R.
Esto funciona aceptablemente bien con cierto tamaño de datos, digamos queremos 10 números del rango del 1 al 100, para esto hacemos una llamada al método ListaIndices(10,1,100), para probar esto hacemos una aplicación de consola para medir el tiempo.
Que bajo este caso en especifico da un tiempo de respuesta aceptable.
Sin embargo cuando se habla de números grandes empieza el rendimiento a decaer, por ejemplo ListaIndices(350000,1,22000000).
Cuando estás a contratiempo, pudiera pasar que nos de el pánico escénico, y pues queremos que es minuto se convierta en segundos o milisegundos, para ello el que empieza a ser mi amigo - la inteligencia artificial DeepSeek, me sugirió el siguiente código, el cual no varía mucho de la lógica que se tiene del método ListaIndices(). Dada esta sugerencia se agregó un método nuevo llamado Muestra().
El cual, en lugar de regresar una lista, regresa una colección llamada
HashSet(), que al ser un conjunto no permite elementos repetidos, por lo que no es necesario la condición y el método de buscar dentro de la colección.
Vamos a probar con el número de elementos del último ejemplo, para ello modificamos un poco la aplicación de consola agregando un menú y haciendo dos métodos estáticos para medir el rendimiento de los métodos.
Ejecutamos con los valores
Muestra(350000,1,22000000).
Como se puede observar, la diferencia es mucha, solo 9 segundos contra los casi 2 minutos del método que usa una lista.
Una cosa que no me explico, es que para medir el tiempo de un programa en principio utilicé la clase System.Diagnostics.StopWatch() sin éxito, por lo que tuve que usar DateTime().
También por si queda duda aquí dejamos que efectivamente el tamaño de la lista es de 350000.
Hasta aquí dejamos este artículo.
Miguel Araujo.