Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中将ascii编码转换为int并再次转换(快速)_Python_Algorithm_Performance_Cython - Fatal编程技术网

在python中将ascii编码转换为int并再次转换(快速)

在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万

我有一个文件格式(fastq格式),它将一个整数字符串编码为一个字符串,其中每个整数由一个带偏移量的ascii码表示。不幸的是,有两种常用编码,一种偏移量为33,另一种偏移量为64。我通常有几个长度为80-150的一亿字符串要从一个偏移量转换到另一个偏移量。我能想到的最简单的代码是:

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()。。。。