python - 比较字符串列表中字符串中每个字符的最快方法

标签 python bioinformatics

我正在使用生物信息学工具,并使用两个循环来迭代每个字符来构建它。

输入(即 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_aseq_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/

相关文章:

Python 线程名称未分配

java - Biojava 示例运行时出现 ExceptionInInitializerError

r - 将两个 sampleID 的相应值连接到一个新的单列中

python - 如何使用Python中的列表理解从一个元素中获取多个元素?

python - 在列表而不是整数上打印字符串

python - 为什么计数器代码每次计数都会添加额外的行?

python - 通过代理扩展 Django 用户模型可用的方法

python - 计算蛋白质序列的所有可能的 RNA 密码子组合

c++ - 通过 StringSet 进行在线模式搜索

python - 将随机 True 或 False 附加到 Python 中每行的末尾