나는 사이 썬에 대해 알고하지 않습니다,하지만 당신은 내부 루프에 DICT 항목에 접근 피할 수 :
adj_list = defaultdict(list)
for strng1 in my_list:
a1 = adj_list[strng1]
c1 = counts[strng1]
for strng2 in my_list:
if distance.hamming(strng1, strng2) == 1 and c1 >= (counts[strng2]*2):
a1.append(strng2)
당신도 후반에만 반복하여 더 많은을 절감하고 대칭 APPEND을 수행 할 수 있습니다. 그렇게하면 대칭이므로 거리 계산의 50 %를 절약 할 수 있습니다. 당신은 오직 위 행렬 삼각형 (대각선을 제외하고, 나는 그 자체와 한 문자열의 거리가 0이라고 가정)을 전체 행렬 대신에 수행합니다.
for i,strng1 in enumerate(my_list):
...
for j in range(i+1,len(my_list)):
내 시도, 잘 모르겠지만, 근접해야합니다 :
adj_list = defaultdict(list)
for i,strng1 in enumerate(my_list):
a1 = adj_list[strng1]
c1 = counts[strng1]
for j in range(i+1,len(my_list)):
strng2 = my_list[j]
if distance.hamming(strng1, strng2) == 1:
c2 = counts[strng2]
if c1 >= (c2*2):
a1.append(strng2)
if c2 >= (c1*2):
adj_list[strng1].append(strng2)
crysis405 편집 :
원본 :
def adj_lst(my_list, counts):
adj_list = defaultdict(list)
for strng1 in my_list:
a1 = adj_list[strng1]
c1 = counts[strng1]
for strng2 in my_list:
if distance.hamming(strng1, strng2) == 1 and c1 >= (counts[strng2]*2):
adj_list[strng1].append(strng2)
하기 권장 개선 :
def adj_lst_fast(my_list, counts):
adj_list_fast = defaultdict(list)
for i,strng1 in enumerate(my_list):
a1 = adj_list_fast[strng1]
c1 = counts[strng1]
for j in range(i+1,len(my_list)):
strng2 = my_list[j]
if distnace.hamming(strng1, strng2:
c2 = counts[strng2]
if c1 >= (c2*2):
adj_list_fast[strng1].append(strng2)
elif c2 >= (c1*2):
adj_list_fast[strng2].append(strng1)
성능 :
print(timeit.timeit('adj_lst(my_list, counts)', number = 10000,
setup="from __main__ import adj_lst, my_list, counts"))
1.2892486669989012
print(timeit.timeit('adj_lst_fast(my_list, counts)', number = 10000,
setup="from __main__ import adj_lst_fast, my_list, counts"))
0.6437049919986748
@까지 우리는 당신 같은 더 편집자가 필요합니다 :) 내 지점을 증명하여 뛰어난 편집 할 crysis405 거대한 엄지 손가락. –