2010-09-27 16 views
6

Bir tamsayı dizisini, her bir tamsayı bir ofset ile bir ascii kodu ile temsil edilen bir dize olarak kodlayan bir dosya formatım (fastq formatı) var. Ne yazık ki, ortak kullanımda iki kodlama vardır, biri 33 ofseti ve diğeri ise 64 ofset ile. Ben bir offset diğerine dönüştürmek için genellikle 100-150 uzunluk uzunlukları var.Ascii kodlamasını python'a dönüştür (hızlıca)

def phred64ToStdqual(qualin): 
    return(''.join([chr(ord(x)-31) for x in qualin])) 

Bu sadece iyi çalışır, ancak özellikle hızlı değildir: Ben bu tür bir şey yapmak için ile gelebilir en basit kodudur. 1 milyon dizimde, makinemde yaklaşık 4 saniye sürüyor. Çeviriyi yapmak için birkaç dict kullanmaya gidersem, bunu yaklaşık 2 saniyeye indirebilirim.

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])) 

Körü körüne cython altında çalışırsam, 1 saniyeden kısa bir süre için kapatırım.
C-seviyesinde olduğu gibi, bu sadece int için bir döküm, çıkarma ve daha sonra char için cast. Yazmadım ama sanırım biraz daha hızlı. Bunu bir python veya daha iyi bir cython sürümünde daha iyi kodlamak dahil olmak üzere herhangi bir ipucu, bu oldukça yararlı olacaktır.

sayesinde

Sean urllib.quote için koduna baktığımızda

+0

'() 'listeleri oluşturmak ve atmak yerine jeneratörler kullanmak için. büyük fark, ama biraz yapmalı. – RichieHindle

+0

[] 'yi() ile değiştirerek,() son python – pixelbeat

+0

ile gereksizdir. İyi fikir, ancak dize katılmasının bir listeye ihtiyacı olduğuna inanıyorum, bu yüzden doğrudan çalışmaz diye düşünmüyorum. – seandavi

cevap

4

, ne yaptığını benzer bir şey var. Görünüşe gibi: Yukarıdaki fonksiyon eşleştirmeleri urllib.quote içinde, sen '%' almak zorunda (aynı uzunlukta değildir durumunda çalıştığını

_map = {} 
def phred64ToStdqual2(qualin): 
    if not _map: 
     for i in range(31, 127): 
      _map[chr(i)] = chr(i - 31) 
    return ''.join(map(_map.__getitem__, qualin)) 

Not -> '% 25'

. her çeviri aynı uzunlukta olduğundan Ama aslında, piton sadece bu çok hızlı bir şekilde yapan bir işlevi vardır. maketrans ve translate muhtemelen çok daha hızlı almazsınız: ile `` [] değiştirmeyi deneyin

import string 
_trans = None 
def phred64ToStdqual4(qualin): 
    global _trans 
    if not _trans: 
     _trans = string.maketrans(''.join(chr(i) for i in range(31, 127)), ''.join(chr(i) for i in range(127 - 31))) 
    return qualin.translate(_trans) 
+0

Teşekkürler, Mike. Bu, yukarıdaki gibi aynı makinede 0,1 saniye hızla yanan ve amacım için yeterince hızlı olacak. Yukarıda listelenen phred64ToStdqual4() ile yapışacağım .... – seandavi