如何只复制值不使用引用,或者我应该用这个内部列表引用做什么?

时间:2015-10-13 19:45:25

标签: python memory memory-leaks

我写了Smith-Waterman算法,它正在泄漏

这是我泄漏的代码片段:

for row in range(1, n + 1):
    for col in range(1, m + 1):
        left = table[row][col - 1] - 1
        up = table[row - 1][col] - 1
        upLeft = table[row - 1][col - 1] + s(seq1[col - 1], seq2[row - 1])
        table[row][col] = max(left, up, upLeft)

最后一行泄密。

如何只复制值而不是使用引用,或者我应该用这个内部列表引用做什么?

其他问题是如何优化此算法仅使用2列/行,但它可能并不困难。首先,我想知道代码泄漏的原因。

完整代码:

def smith_waterman(seq1, seq2):
"""
:rtype : float
:return: folat 
:param seq1: list of 0,1,2
:param seq2: list of 0,1,2
"""
m = len(seq1)
n = len(seq2)

def s(a, b):
    """

    :param a: 0,1,2
    :param b: 0,1,2
    :return: iteger
    """
    c = a + b
    if a == b:
        return 2
    elif c == 3:
        return 1
    elif c == 2:
        return 2
    else:
        return -1

# create empty table
table = []
for i in range(n + 1):
    table.append([])
    for j in range(m + 1):
        table[i].append(0)

for row in range(1, n + 1):
    for col in range(1, m + 1):
        left = table[row][col - 1] - 1
        up = table[row - 1][col] - 1
        upLeft = table[row - 1][col - 1] + s(seq1[col - 1], seq2[row - 1])
        table[row][col] = max(left, up, upLeft)
return table[n][m]) / (n + m)

Reference cycle in table

1 个答案:

答案 0 :(得分:0)

“漏水”是什么意思?你指的是你的算法使用的内存比预期多吗?如果是这种情况,那么它可能与您的表定义与其用法有关:您正在分配一个n x m表,而您只使用(n-1)x(m-1)个项。 尝试将循环从range(1, n+1)更改为range(n),对第二个索引进行类似的更改(当然更新索引用法)。