코드에서 줄을 제거하면 성능이 크게 향상되는 이유가 궁금합니다. 함수 자체는 사전을 가져와 다른 키의 하위 문자열 인 모든 키를 제거합니다. IS 아래로 내 코드를 느리게다른 키의 부분 문자열 인 사전에서 키를 제거하는 기능 수행
라인 :
if sub in reduced_dict and sub2 in reduced_dict:
여기 내 함수의 : 서브 SUB2 여러 번에있는 경우
def reduced(dictionary):
reduced_dict = dictionary.copy()
len_dict = defaultdict(list)
for key in dictionary:
len_dict[len(key)].append(key)
start_time = time.time()
for key, subs in len_dict.items():
for key2, subs2 in len_dict.items():
if key2 > key:
for sub in subs:
for sub2 in subs2:
if sub in reduced_dict and sub2 in reduced_dict: # Removing this line gives a significant performance boost
if sub in sub2:
reduced_dict.pop(sub, 0)
print time.time() - start_time
return reduced_dict
기능 검사가. 나는이 비교가 이미 이루어 졌는지를 확인하면 시간을 절약 할 수 있다고 생각했다. 이것은 사실이 아닌 것 같습니다. 왜 사전에서 조회를위한 일정 시간 함수가 나를 감속 시키는가?
저는 초보자입니다. 개념에 관심이 있습니다.
문제의 줄이 False를 반환하는지 테스트했을 때 그 줄이 나타납니다.
- 19.6360001564 초 : 나는 함수의 입력 사전에 14,805 키를 들어 다음과 같은
def reduced(dictionary): reduced_dict = dictionary.copy() len_dict = defaultdict(list) for key in dictionary: len_dict[len(key)].append(key) start_time = time.time() for key, subs in len_dict.items(): for key2, subs2 in len_dict.items(): if key2 > key: for sub in subs: for sub2 in subs2: if sub not in reduced_dict or sub2 not in reduced_dict: print 'not present' # This line prints many thousands of times if sub in sub2: reduced_dict.pop(sub, 0) print time.time() - start_time return reduced_dict
이것을 테스트했습니다. 라인이없는 경우
- 33.1449999809 초 줄을 가지고
다음은 3 가지 사전 예제입니다. Biggest sample dictionary with 14805 keys, medium sample dictionary 및 smaller sample dictionary
I가 가장 큰 예를 사전에 제 14,000 키에 대한 키 (X)의 #의 입력 크기 VS 초 (Y)에있는 시간 그래프. 이 모든 함수는 지수 적으로 복잡합니다. 이 질문에
- 존 Zwinck answer이 문제에 나의 첫 번째 시도에서입니다. 이것은 76s를 가지고 갔다
- 매트이 비교를위한이 질문에있는 알고리즘은 dict 비교 라인
- tdelaney solution이 질문에 대한 알고리즘이다. 관련 질문의 순서 알고리즘 1 & 2
- 게오르그 solution 내가 허용 대답은 분명히 선형 시간에 실행
입력 크기에 존재하는 곳에 DICT 룩업 == 문자열 검색 실행 시간.
이것을 테스트하는 데 사용할 샘플 딕트를 포함 할 수 있습니까? 또한 이것을 측정하기 위해'time.time()'을 사용하는 것은 일반적으로 충분히 정확하지 않습니다. 대신'timeit' 모듈을 사용해야합니다. – dano
다음은 두 개의 사전 예제입니다. 첫 번째는 http://justpaste.it/festival_dict보다 길고 두 번째 것은 더 짧습니다. http://justpaste.it/ATGC – 12345678910111213
네 번째 중첩 된 "for"루프로 인해 코드가 더 느려질 수 있습니다. :) –