我正在使用生物信息学工具,并使用两个循环来迭代每个字符来构建它。
输入(即 seq1 和序列)是长度相同的核苷酸字符串,例如“AGATGCTAGTA”
。 sequence_info
是所有序列的列表。
速度非常慢,因此我通过使用 continue 而不是添加零并将 bio_array
存储为 numpy 数组来提高速度。这是新代码。
for (sequence, sequence_location) in sequence_info:
value = slow_function(seq1, sequence)
def slow_function(seq1,sequence):
calc=0
for i,nt in enumerate(seq1):
if nt == sequence[i]:
continue
else:
calc += bio_array[i]
return float(calc)
在 jupyter 笔记本中使用 %%timeit
,它仍然在 100ms
左右。我需要它在 1-5ms
左右或以下。我尝试将函数转换为迭代器并使用列表理解/映射而不是使用循环。但这些方法并没有产生显着的效果。
我认为可能可以使用 numpy,但我无法通过查看文档或 stackoverflow 找到使用的方法。由于如果序列中存在不匹配,我需要将 bio_array
中的特定值添加到一起,因此我认为需要单独比较字符串中的每个字符值。
提高此代码速度尽可能快的最佳方法是什么?
最佳答案
如果我理解正确,您的问题是您希望根据两个字符串序列不匹配的位置对数组的元素求和。您可以简单地创建序列的字符数组,然后使用 numpy 条件索引来获取不匹配的值。这是一个简化的示例:
seq_a = np.array(list('ABCDEFGH'))
seq_b = np.array(list('ABCZEFZH'))
bio_array = np.array([1, 5, 9, 4, 3, 8, 2, 7])
然后,在 seq_a
和 seq_b
之间进行逐元素比较,结果如下:
>>> seq_a != seq_b
array([False, False, False, True, False, False, True, False])
然后,您可以使用此结果索引 bio_array
以获取相关值,然后对它们求和:
>>> bio_array[seq_a != seq_b]
array([4, 2])
>>> bio_array[seq_a != seq_b].sum()
6
关于python - 比较字符串列表中字符串中每个字符的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59558559/