Ho un formato file (formato fastq) che codifica una stringa di interi come stringa in cui ogni intero è rappresentato da un codice ASCII con un offset. Sfortunatamente, ci sono due codifiche di uso comune, una con un offset di 33 e l'altra con un offset di 64. In genere ho diverse 100 milioni di stringhe di lunghezza 80-150 per convertire da un offset all'altro. Il codice più semplice che ho potuto venire con per fare questo tipo di cose è:Converti codifica ascii in int e viceversa in python (rapidamente)
def phred64ToStdqual(qualin):
return(''.join([chr(ord(x)-31) for x in qualin]))
Questo funziona bene, ma non è particolarmente veloce. Per 1 milione di corde, ci vogliono circa 4 secondi sulla mia macchina. Se cambio l'uso di un paio di dicts per fare la traduzione, posso ridurlo a circa 2 secondi.
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]))
Se ciecamente corro sotto Cython, ho capito fino a poco meno di 1 secondo.
Sembra al livello C, questo è semplicemente un cast per int, sottrarre e quindi eseguire il cast in char. Non ho scritto questo, ma suppongo che sia un po 'più veloce. Qualche suggerimento, incluso come migliorare il codice in questo in Python o anche in una versione cython, sarebbe abbastanza utile.
Grazie,
Sean
Provare a sostituire '[]' con '() 'usare i generatori piuttosto che creare e scartare gli elenchi. Dubito che farà un enorme differenza, ma dovrebbe fare qualcosa. – RichieHindle
Sostituendo [] con(), i() sono ridondanti con qualsiasi python recente – pixelbeat
Ottima idea, ma il join di stringhe ha bisogno di un elenco, credo, in modo che non funzioni direttamente Non credo. – seandavi