私は、Python の最長共通サブシーケンスアルゴリズムを特に大規模な入力セットに対して実行し、結果の LCS の長さを 2 次元の numpy 配列に格納していました。時間の経過とともに速度が低下していることに気付きました。約 3 分の 1 で、クロールに速度が低下し、その後クラッシュして、不可解なエラー メッセージ「pnc=: N」が出力され、その後に改行がありませんでした (私のプログラムは、停止する前にもう 1 行の出力を出力しました)。また、この時点でかなりの量の割り当てられたメモリが解放されたようです。これが何を意味するのか誰にも分かりませんか?
編集: クラッシュしたコードの部分は次のとおりです。
#m and n are both around 12,000
lengths = np.empty((m+1, n+1), dtype=np.uint)
lengths[0,:] = 0
lengths[1:,0] = 0
if m > 0 and n > 0:
for i in xrange(1, m + 1):
for j in xrange(1, n + 1):
#eqTest is a function comparing two sequence elements, like cmp
eq = eqTest(a[i-1], b[j-1])
if eq:
lengths[i,j] = lengths[i-1,j-1] + 1
elif lengths[i-1,j] >= lengths[i,j-1]:
lengths[i,j] = lengths[i-1,j]
else:
lengths[i,j] = lengths[i,j-1]
LCSの長さの配列全体が最初に割り当てられてから入力されるため、時間が経つにつれて速度が低下したり、より多くのリソースを使用したりする原因はわかりません。私が使用している等価性テストは、部分的に C で記述されているため説明が困難ですが、効果的には次のようになります。
def eqTest(l1, l2):
words1 = l1.split()
words2 = l2.split()
if len(words1) == len(words2):
for i in xrange(len(words1)):
#MATCHERS is a list of around 10 compiled regular expressions
for m in MATCHERS:
if m.match(s1) is not None and m.match(s2) is not None:
break
else:
result = False
break
else:
result = True
else:
result = False
return result