簡體   English   中英

將ascii編碼轉換為int並在python中再次返回(快速)

[英]Convert ascii encoding to int and back again in python (quickly)

我有一個文件格式(fastq格式),它將一個整數字符串編碼為一個字符串,其中每個整數由帶有偏移量的ascii代碼表示。 不幸的是,有兩種常用的編碼,一種偏移量為33,另一種偏移量為64.我通常有幾個1億個字符串,長度為80-150,可以從一個偏移量轉換到另一個偏移量。 我可以用來做這類事情的最簡單的代碼是:

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

這很好用,但速度不是很快。 對於100萬個字符串,我的機器大約需要4秒鍾。 如果我改用使用幾個dicts進行翻譯,我可以將其縮短到大約2秒。

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

如果我盲目地在cython下運行,我會把它降到不到1秒。
看起來像在C級,這只是一個轉換為int,減去,然后轉換為char。 我沒有寫這篇文章,但我猜它速度要快得多。 任何提示,包括如何在python甚至cython版本中更好地編寫代碼都會非常有用。

謝謝,

肖恩

如果你看一下urllib.quote的代碼,就會有類似於你正在做的事情。 看起來像:

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

請注意,上述函數適用於映射長度不同的情況(在urllib.quote中,您必須使用'%' - >'%25'。

但實際上,由於每個翻譯都是相同的長度,python有一個功能可以很快地完成這個: maketranstranslate 你可能不會比以下快得多:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM