【发布时间】:2022-01-02 16:24:06
【问题描述】:
我有一个采用 DNA 字符串的代码,其中仅找到 4 个字符:A、C、T 和 G,例如“ATACAAG”,并且对于每个字符,如果找到了 3 个其他可能的字符。该代码包括一个用于字符串的循环和另一个用于可能字符列表的循环。问题是字符串很长:多达数十万个字符,因此速度不快并且计算机会发热(风扇开始快速工作)。
我正在寻找一种更快的方法来做到这一点。我尝试了列表理解,但它仍然很慢。我还尝试将代码作为函数从 pandas lambda 调用,每个字符串仍然需要大约一分钟。这是我能得到的最好的吗?
对于每个字符,代码在文件的不同行中记录了 3 个替代项。
代码:
bases = set(list('ACGT'))
alts = {base: list(bases.difference(base)) for base in bases}
def get_variants(data, output_path): # pb: position base, b: base
[open(output_path + f'/{data.symbol}_variants.txt', 'a').writelines(
[f'{data.chromosome}\t{data.end + index}\t{data.end + index}\t{pb}/{b}\t{data.strand}\n' for b in alts[pb]])
for index, pb in enumerate(data.sequence)]
为“ATACAAG”调用函数:
get_variants(pandas.Series({'symbol': 'XYZ', 'sequence': 'ATACAAG', 'chromosome': 12, 'start': 9067664, 'end': 9067671, 'strand': '-'}),
'write_an_existing_output_directory_path_here')
输出排列在以下列中的文件中:
chromosome number, start position, end position, original character/alternative character, strand (can + or -)
它在文件 XYZ_variants.txt 中产生以下行:
12 9067664 9067664 A/T -
12 9067664 9067664 A/G -
12 9067664 9067664 A/C -
12 9067665 9067665 T/A -
12 9067665 9067665 T/G -
12 9067665 9067665 T/C -
12 9067666 9067666 A/T -
12 9067666 9067666 A/G -
12 9067666 9067666 A/C -
12 9067667 9067667 C/T -
12 9067667 9067667 C/A -
12 9067667 9067667 C/G -
12 9067668 9067668 A/T -
12 9067668 9067668 A/G -
12 9067668 9067668 A/C -
12 9067669 9067669 A/T -
12 9067669 9067669 A/G -
12 9067669 9067669 A/C -
12 9067670 9067670 G/T -
12 9067670 9067670 G/A -
12 9067670 9067670 G/C -
谢谢。
【问题讨论】:
-
请提供输入文件/数据框的示例
-
我有。该问题包括一个
pandas.Series对象,它是数据框中一行的示例。 -
如果你想遍历字符串中的每个字符,那么不,没有更快的方法。列表推导只会使代码更小,不会加快进程。
标签: python pandas string lambda nested-loops