Oh, sadece MANY'ın bir hamming mesafesi < 2 ile nasıl eşleştiğini sayıyorsunuz? Bu çok daha hızlı yapılabilir. kodunuzu çoğu zaman on line harcanacak
total_count = 0
for line in f:
# skip the s = f.readline() since that's what `line` is in this
line = line.strip() # just in case
for ll in l:
if hamming(line, ll) <= 2:
total_count += 1
break # skip the rest of the ll in l loop
# and then you don't need any processing afterwards either.
Not:
if hamming(line, ll) <= 2:
Yani BÜYÜK genel komut hızını artıracağını algoritmayı geliştirmek herhangi bir yolu. Boud'un cevabı,
jellyfish
'un
hamming_distance
işlevinin erdemlerini yüceltir, ancak herhangi bir kişisel deneyim olmadan kendimi tavsiye edemem. Ancak hamming mesafesinin daha hızlı uygulanmasına yönelik tavsiyesi ses!
Peter DeGlopper "İki ya da daha az hamming mesafe" kibrit altı farklı kümeler halinde l
liste üfleme önerir. Yani, iki veya daha az hamming mesafesine sahip olabilecek tüm olası çiftleri içeren bir grup set. Muhtemelen hamming_sets
transform_function: set_of_results
anahtar değer çiftleri bir sözlük yaparak okunabilirliği kazanabilir
# hamming_sets is [ {AB??}, {A?C?}, {A??D}, {?BC?}, {?B?D}, {??CD} ]
hamming_sets = [ set(), set(), set(), set(), set(), set() ]
for ll in l:
# this should take the lion's share of time in your program
hamming_sets[0].add(l[0] + l[1])
hamming_sets[0].add(l[0] + l[2])
hamming_sets[0].add(l[0] + l[3])
hamming_sets[0].add(l[1] + l[2])
hamming_sets[0].add(l[1] + l[3])
hamming_sets[0].add(l[2] + l[3])
total_count = 0
for line in f:
# and this should be fast, even if `f` is large
line = line.strip()
if line[0]+line[1] in hamming_sets[0] or \
line[0]+line[2] in hamming_sets[1] or \
line[0]+line[3] in hamming_sets[2] or \
line[1]+line[2] in hamming_sets[3] or \
line[1]+line[3] in hamming_sets[4] or \
line[2]+line[3] in hamming_sets[5]:
total_count += 1
: gibi bu görünebilir.
hamming_sets = {lambda s: s[0]+s[1]: set(),
lambda s: s[0]+s[2]: set(),
lambda s: s[0]+s[3]: set(),
lambda s: s[1]+s[2]: set(),
lambda s: s[1]+s[3]: set(),
lambda s: s[2]+s[3]: set()}
for func, set_ in hamming_sets.items():
for ll in l:
set_.add(func(ll))
total_count = 0
for line in f:
line = line.strip()
if any(func(line) in set_ for func, set_ in hamming_sets.items()):
total_count += 1
Önce bu dosyayı ayrıştırmanızı ve öğeleri bir listeye kaydetmenizi, ardından da 'filter'i uygulamanızı ve ardından listenin boyutunu döndürmesini öneririm. –
küçük bir öneri, yineleme sırasında min değerini hesaplayabilir ve başka bir döngüye ihtiyacınız yoktur 'min (dist_array) ' – Arman
Başka bir öneri - mesafe 0 ise, döngüyü kırabilirsiniz. – khachik