2015-10-13 24 views
1

我已经写了史密斯 - 沃特曼算法及它是否漏水如何复制只有值不使用引用,或者我该怎么处理这个内部列表引用?

这里是我的代码泄漏片段:

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

+2

为什么你认为代码泄漏内存?你强制垃圾收集?你是否强制Python将内存释放回操作系统? –

+0

对不起,我更新了我的问题,我正在尝试使用gc,但找不到任何项目或者可能无法正常工作。我现在的问题是如何快速解除最大值(left,up,upLeft)。 – Behoston

+0

该代码泄漏内存似乎不太可能。但如果不知道这里发生了什么,很难说出是什么原因造成了你的问题。例如:什么是's'?什么是“seq1”和“seq2”? m和n的值是多少? – strubbly

回答

0

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

+0

为什么更改范围参数?它现在可以工作,我不认为改变它可以防止泄漏。我的意思是内存仍然在返回值后分配。如果我用零或......代替max(...)内存使用增长较慢,并且在返回时释放(当表无法访问时)。 – Behoston

相关问题