在python中将ascii编码转换为int并再次转换(快速)
我有一个文件格式(fastq格式),它将一个整数字符串编码为一个字符串,其中每个整数由一个带偏移量的ascii码表示。不幸的是,有两种常用编码,一种偏移量为33,另一种偏移量为64。我通常有几个长度为80-150的一亿字符串要从一个偏移量转换到另一个偏移量。我能想到的最简单的代码是:在python中将ascii编码转换为int并再次转换(快速),python,algorithm,performance,cython,Python,Algorithm,Performance,Cython,我有一个文件格式(fastq格式),它将一个整数字符串编码为一个字符串,其中每个整数由一个带偏移量的ascii码表示。不幸的是,有两种常用编码,一种偏移量为33,另一种偏移量为64。我通常有几个长度为80-150的一亿字符串要从一个偏移量转换到另一个偏移量。我能想到的最简单的代码是: def phred64ToStdqual(qualin): return(''.join([chr(ord(x)-31) for x in qualin])) 这种方法效果很好,但不是特别快。对于100万
def phred64ToStdqual(qualin):
return(''.join([chr(ord(x)-31) for x in qualin]))
这种方法效果很好,但不是特别快。对于100万个字符串,在我的机器上大约需要4秒钟。如果我改为用几张口述来做翻译,我可以把时间缩短到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版本编写代码,都会非常有用 谢谢
Sean如果您查看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有一个函数可以非常快速地完成这项工作:而且,您可能不会比以下更快:
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)
尝试将
[]
替换为()
以使用生成器,而不是创建和丢弃列表。我怀疑这会有很大的不同,但应该会有一些不同。如果将[]替换为(),则()与任何pythonFine最近的想法都是多余的,但是我相信字符串连接需要一个列表,所以我认为这不会直接起作用。嗯,对于Python2.6.1:“。连接(x代表x在[“1”、“2”、“3”])
->'1.2.3'
我很笨。我在cython下运行了生成器——在那里不受支持。Python 2.6.2使用生成器版本要慢20%。谢谢你,Mike。在与上面相同的机器上,这是非常快的0.1秒,对于我来说已经足够快了。我将坚持使用上面列出的phred64ToStdqual4()。。。。