我已经写了史密斯 - 沃特曼算法及它是否漏水如何复制只有值不使用引用,或者我该怎么处理这个内部列表引用?
这里是我的代码泄漏片段:
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)
为什么你认为代码泄漏内存?你强制垃圾收集?你是否强制Python将内存释放回操作系统? –
对不起,我更新了我的问题,我正在尝试使用gc,但找不到任何项目或者可能无法正常工作。我现在的问题是如何快速解除最大值(left,up,upLeft)。 – Behoston
该代码泄漏内存似乎不太可能。但如果不知道这里发生了什么,很难说出是什么原因造成了你的问题。例如:什么是's'?什么是“seq1”和“seq2”? m和n的值是多少? – strubbly