~100 万個の一意の 16 文字の文字列 (VEC と呼ばれる配列) のリストがあり、Python でそれぞれの最小ペアワイズ ハミング距離 (RES と呼ばれる配列) を計算したいと考えています。基本的に、完全なペアワイズ距離行列を一度に 1 行ずつ計算していますが、各行の RES に最小値のみを格納しています。
VEC= ['AAAAAAAAAAAAAAAA','AAAAAAAAAAAAAAAT','AAAAGAAAAAATAAAA'...]
dist(VEC[1],VEC[2])=1、dist(VEC[1],VEC[3])=2など...そしてRES[1]=1となります。私が思いついたこれらのページのヒントとコツを使用します。
#METHOD#1:
import Levenshtein
import numpy
RES=99*numpy.ones(len(VEC))
i=0
for a in VEC:
dist=numpy.array([Levenshtein.hamming(a,b) for b in VEC] ) #array of distances
RES[i]=numpy.amin(dist[dist>0]) #pick min distance greater than zero
i+=1
わずか 10,000 の短い VEC には約 70 秒かかりましたが、それを 100 万に推定すると 8 日かかります。距離行列の対称部分を再計算しているため、私のアプローチは無駄に思えます。そのため、行ごとに RES を更新しながら行列の半分を計算しようとしました。
#METHOD #2:
import Levenshtein
import numpy
RES=99*numpy.ones(len(VEC))
for i in range(len(VEC)-1):
dist=[Levenshtein.hamming(VEC[i],VEC[j]) for j in range(i+1, len(VEC))]
RES[i]=min(numpy.amin(dist),RES[i])
#update RES as you go along:
k=0
for j in range(i+1,len(VEC)):
if dist[k]<RES[j]:
RES[j]=dist[k]
k+=1
おそらく驚くべきことではありませんが、この 2 番目のアプローチはほぼ 2 倍の時間 (117 秒) かかるため、あまり良くありません。とにかく、これを高速化するための改善/変更を推奨できる人はいますか?