【发布时间】:2015-03-08 07:43:07
【问题描述】:
我想在 Python 中使用位编码对核苷酸“A”、“G”、“C”和“T”进行编码。例如:
'A' = 00
'G' = 01
'C' = 10
'T' = 11
为了构建一个包含 k-mer 的巨大字典,例如:
dic = { 'ATGACTGACT':231, 'AAATGACGGAC':500 ... }
我认为这可以减少该 dict 所需的内存量,因为“ATGC”需要 4 个字节,但同一个字需要 8 个位编码。
我不确定这是否可以做到,如果可以,我如何使用 Python 来做到这一点
提前致谢!
已编辑:对不起,我没有正确解释自己。
我想要的是遍历一个由 'ATGC's 组成的序列,滑动窗口大小为 k,并计算每个 k-mer 在该序列中出现的次数。例如:
'ATGAATGAA' # with a sliding window of 5 would be
dic = { 'ATGAA':2, 'TGAAT':1, 'GAATG':1, 'AATGA':1, }
由于我想在开始读取序列之前使用大小为 k 的“AGTC”的所有可能组合来构造字典,以便以每个 k-mer 作为键并对其值求和 1 来访问该字典,我想知道是否可以使用位编码存储该字典上的 k-mers。或多或少:
dic = {1011001010: 3, 0000110011: 666, ... etc }
目前我正在使用 itertools 构建该字典。
# k-mers of size 8
{''.join(x):0 for x in itertools.product('ATGC', repeat=8)}
我猜另一个问题是每个 k-mer 都需要转换为该位编码才能访问字典
【问题讨论】:
-
不清楚:您的 dic 示例中仍然有完整和位版本的 k-mer,那么内存减少在哪里?另一个重要的问题 - 之后你打算用这些位做什么?部分搜索?使用指标?
-
00001100会编码什么?亚特?助教? AATA? -
对于可变长度字符串,您可以使用 bitstring 之类的模块(特别是用作 dict 键的 ConstBitStream)。我不知道这实际上会如何影响性能/内存使用。顺便问一下,你能成为prematurely optimizing吗?我不是说你是;问题是,持续 4 倍的内存改进是否值得额外的复杂性?现在是否应该进行更改?
-
为了放大@Lack,除非你已经证明存在内存不足,否则不要针对预期的问题进行优化。此外,您应该探索Biopython,而不是重新发明轮子。使用 Python 的部分理由是大量的第三方库可能已经满足您的需求。
-
我不认为我过早优化。实际上,我的程序已经在运行,并且我使用了 Biopython。问题是处理人类基因组需要 7 个小时,现在我正在尝试另一种方法。
标签: python bit bioinformatics