【发布时间】:2015-11-11 09:21:44
【问题描述】:
我正在使用 Python 的 bitarray module 将写入二进制文件的 DNA 序列转换为其反向补码。每个核苷酸由以下格式的两位表示:A - 00, C - 01, G - 10, T - 11.
例如,AGCTACGG (00 10 01 11 00 01 10 10) 的反向补码将是 CCGTAGCT (01 01 10 11 00 10 01 11)。
这个序列正好占用 16 位(2 个字节),但是长度为 9 的序列将占用 18 位,并且它被填充以占用24 位(3 字节)。
目前我使用 for 循环进行转换,但这个解决方案非常慢。
def reverse_complement( my_bitarray, seq_length ):
for i in range(0, 2 * seq_length - 1, 2):
if my_bitarray[i] == my_bitarray[i + 1]:
if my_bitarray[i] == 0:
my_bitarray[i], my_bitarray[i + 1] = 1, 1
else:
my_bitarray[i], my_bitarray[i + 1] = 0, 0
#padding if the bitarray is not a multiple of 8 bits in length
if seq_length / 4 != int():
my_bitarray.reverse()
my_bitarray.fill()
my_bitarray.reverse()
return my_bitarray
a = bitarray()
a.frombytes(seq[::-1])
b = a[int(seq_start)::] # seq without padding
b.reverse()
reverse_complement(b, seq_length)
关于如何加快此过程的任何提示?
【问题讨论】:
-
那段代码真的和你在文中描述的一样吗?
-
@skyking 对不起,我遗漏了这个功能之外的部分,将编辑我的帖子。感谢您的批判性思维!
-
您是否尝试过在序列的字节表示上使用 LUT?我还没有尝试过,但它可能会表现得更好。