Tengo un formato de archivo (formato fastq) que codifica una cadena de enteros como una cadena donde cada entero está representado por un código ascii con un desplazamiento. Desafortunadamente, hay dos codificaciones de uso común, una con un desplazamiento de 33 y la otra con un desplazamiento de 64. Normalmente tengo varios 100 millones de cadenas de longitud 80-150 para convertir de una compensación a la otra. El código más simple que podía llegar a hacer para este tipo de cosas es:Convertir codificación ascii a int y viceversa en python (rápidamente)
def phred64ToStdqual(qualin):
return(''.join([chr(ord(x)-31) for x in qualin]))
Esto funciona bien, pero no es especialmente rápido. Para 1 millón de cuerdas, lleva unos 4 segundos en mi máquina. Si cambio a usar un par de dicts para hacer la traducción, puedo bajar esto a aproximadamente 2 segundos.
ctoi = {}
itoc = {}
for i in xrange(127):
itoc[i]=chr(i)
ctoi[chr(i)]=i
def phred64ToStdqual2(qualin):
return(''.join([itoc[ctoi[x]-31] for x in qualin]))
Si corro a ciegas bajo cython, lo bajo a menos de 1 segundo.
Parece que en el nivel C, esto es simplemente un molde para int, restar, y luego lanzar a char. No he escrito esto, pero supongo que es bastante más rápido. Cualquier sugerencia que incluya cómo codificar mejor esto en python o incluso una versión de cython para hacer esto sería bastante útil.
Gracias,
Sean
Intente reemplazar '[] 'con'() 'para usar generadores en lugar de crear y descartar listas. Dudo que hará una gran diferencia, pero debería hacer algo. – RichieHindle
Reemplazando [] con(), the() son redundantes con cualquier pitón reciente – pixelbeat
Buena idea, pero la unión de cadenas necesita una lista, creo, por lo que no funcionará directamente, no creo. – seandavi