大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
您将4个不同“数字”的字符串解释为数字,因此以4为基数.如果您有一串实际数字,范围为0-3,则可以让int()真正快速地生成一个整数.
def seq_to_int(seq, _m=str.maketrans(‘ACGT’, ‘0123’)):
return int(seq.translate(_m), 4)
上面的函数使用str.translate()用匹配的数字替换4个字符中的每个字符(我使用静态str.maketrans() function创建转换表).然后将所得的数字字符串解释为以4为底的整数.
请注意,这将生成一个整数对象,而不是零和一个字符的二进制字符串:
>>> seq_to_int(‘TGTGAGAAGCACCATAAAAGGCGTTGTG’)
67026852874722286
>>> format(seq_to_int(‘TGTGAGAAGCACCATAAAAGGCGTTGTG’), ‘016x’)
’00ee20914c029bee’
>>> format(seq_to_int(‘TGTGAGAAGCACCATAAAAGGCGTTGTG’), ‘064b’)
‘0000000011101110001000001001000101001100000000101001101111101110’
这里不需要填充;只要您的输入序列为32个字母或更少,则结果整数将适合无符号8字节整数表示形式.在上面的输出示例中,我使用format()字符串分别将该整数值格式化为十六进制和二进制字符串,然后将这些表示形式零填充到64位数字的正确位数.
为了衡量这是否更快,让我们随机抽取一百万个测试字符串(每个字符串长28个字符):
>>> from random import choice
>>> testvalues = [”.join([choice(‘ATCG’) for _ in range(28)]) for _ in range(10 ** 6)]
在使用2.9 GHz Intel Core i7的Macbook Pro和Python 3.6.5上,上述功能可以在3/4秒内产生100万次转换:
>>> from timeit import timeit
>>> timeit(‘seq_to_int(next(tviter))’, ‘from __main__ import testvalues, seq_to_int; tviter=iter(testvalues)’)
0.7316284350017668
因此,每个通话为0.73微秒.
(以前,我提倡使用预计算版本,但经过试验,我采用了以4为底的想法).
要将其与到目前为止发布的其他方法进行比较,还需要调整一些方法以产生整数,并将其包装到函数中:
def seq_to_int_alexhall_a(seq, mapping={‘A’: b’00’, ‘C’: b’01’, ‘G’: b’10’, ‘T’: b’11’}):
return int(b”.join(map(mapping.__getitem__, seq)), 2)
def seq_to_int_alexhall_b(seq, mapping={‘A’: b’00’, ‘C’: b’01’, ‘G’: b’10’, ‘T’: b’11’}):
return int(b”.join([mapping[c] for c in seq]), 2)
def seq_to_int_jonathan_may(seq, mapping={‘A’: 0b00, ‘C’: 0b01, ‘G’: 0b10, ‘T’: 0b11}):
result = 0
for char in seq:
result = result << 2
result = result | mapping[char]
return result
然后我们可以比较这些:
>>> testfunctions = {
… ‘Alex Hall (A)’: seq_to_int_alexhall_a,
… ‘Alex Hall (B)’: seq_to_int_alexhall_b,
… ‘Jonathan May’: seq_to_int_jonathan_may,
… # base_decode as defined in https://stackoverflow.com/a/50239330
… ‘martineau’: base_decode,
… ‘Martijn Pieters’: seq_to_int,
… }
>>> setup = “””\n… from __main__ import testvalues, {} as testfunction
… tviter = iter(testvalues)
… “””
>>> for name, f in testfunctions.items():
… res = timeit(‘testfunction(next(tviter))’, setup.format(f.__name__))
… print(f'{name:>15}: {res:8.5f}’)
…
Alex Hall (A): 2.17879
Alex Hall (B): 2.40771
Jonathan May: 3.30303
martineau: 16.60615
Martijn Pieters: 0.73452
我提出的以4为基的方法很容易赢得这一比较.
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189555.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...