Después de un buen rato sin postear nada en el blog por falta de tiempo, ahora regreso para postear algunos artículos sobre programación.
Python es un excelente lenguaje para una tarea como la de generar códigos por ejemplo series o códigos para una lotería o promoción.
Python en su versión 2.6 que probé viene con la librería “Itertools” la cual provee funciones iterativas para el manejo eficiente de ciclos y secuencias.
Para demostrar el uso de la librería un ejemplo sencillo seria generar códigos sin repetición únicos alfanuméricos de 5 dígitos suponiendo que los caracteres pueden ser: ’3479JKLNPQRTWXY’.
recordando un poco de matematica n!/(n-r)! se pueden hacer 360360 permutaciones.
supongamos que necesitamos los codigos generados en sets de 50,000 y necesitamos 300,000 tendriamos algo como esto
import itertools
# permutacion
code = '3479JKLNPQRTWXY'
codigos = itertools.permutations(code,5)
# ruta a los archivos
path_prefix = '/home/strafe/data-codes/'
# numeracion de los archivos
files_number = range(1,6,1)
# lista con los nombres de los archivos
files = []
for x in files_number:
files.append(path_prefix + "set"+str(x)+".csv")
# procesamiento.
inicio=0
fin=50000
for f in files:
file = open(f,'w')
x = list(itertools.islice(codigos,inicio,fin,1))
for i in x:
print >> file, "".join(i)
file.close()
inicio=fin
fin=fin+50000
en el codigo se utilizan “itertools.permutations” y “itertools.islice”, itertools.permutations hace el trabajo y itertools.islice permite tomar un rango determinado de la tupla.
Por razones de desempeño y uso de memoria es mas eficiente usar itertools.islice ya que de esa manera la memoria no se agotaria en tratar de procesar el resultado de itertools.permutations de una sola vez.
al final se tendria un resultado como este en los archivos:
3PQ4K
3PQ4L
3PQ4N
3PQ4R
…
referencias: