簡體   English   中英

比較字符串列表中字符串中每個字符的最快方法

[英]Fastest method to compare each character in string in a list of strings

我正在使用一個生物信息學工具,並使用兩個循環來遍歷每個字符來構建它。

輸入(即 seq1 和序列)是一串核苷酸,例如相同長度的“ AGATGCTAGTA' sequence_info是所有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 notebooks 中使用%%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_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

您應該接受@sshashank124 的回答,但這里有一些快速的代碼來顯示正在發生的事情以及它有多少不同:

import numpy as np
from timeit import timeit


def slow_function(seq1, seq2, costs):
    calc = 0
    for i, nt in enumerate(seq1):
        if nt == seq2[i]:
            continue
        else:
            calc += costs[i]
    return float(calc)


def shorter_slow_function(seq1, seq2, costs):
    return sum(costs[i] for i in range(len(seq1)) if seq1[i] != seq2[i])


def faster_numpy_function(seq1, seq2, costs):
    return costs[seq1 != seq2].sum()


x = np.array(list('ABCDE'))
y = np.array(list('XBCDY'))
c = np.array([1.0, 2.0, 3.0, 4.0, 5.0])


print(timeit(lambda: slow_function(x, y, c)))
print(timeit(lambda: shorter_slow_function(x, y, c)))
print(timeit(lambda: faster_numpy_function(x, y, c)))

結果:

6.7421024
6.665790399999999
5.321171700000001

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM