2017-03-16 3 views
0

itertools.combinations()을 사용하는 스크립트가 있는데 큰 입력 크기로 정지 된 것처럼 보입니다.Python의 시간 초과 문제 itertools.combinations()

필자는 비교적 경험이 부족한 파이썬 프로그래머이므로이 문제를 해결하는 방법을 모르겠습니다. 더 적합한 도서관이 있습니까? 또는 메서드 호출이 멈추는 이유를 디버깅 할 수 있도록 자세한 로깅을 설정하는 방법이 있습니까?

도움을 주시면 감사하겠습니다.

[편집]

def findsubsets(S,m): 
    return set(itertools.combinations(S, m)) 

for s in AllSearchTerms: 
    S.append(itemsize) 
    itemsize = itemsize + 1 

for i in range (1,6): 
    Subset = findsubsets(S,i) 
    for sub in Subset: 
     for s in sub: 
      sublist.append(AllSearchTerms[s]) 
     PComb.append(sublist) 
     sublist = [] 
+5

itertools.combinations (..) 자체는 ** 게으른 **입니다. 그래서 ** 소비자가 출력물을 가지고 무엇을하는지에 달렸습니다 ** ... –

+2

이전 주석에서 알 수 있듯이 결과는'itertools.combinations()'의 리턴 값으로 무엇을하는지에 달려 있습니다. 도움이 더 필요하면 결과 및 결과로 수행 한 작업을 보여주는 코드 스 니펫을 표시하십시오. [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve)를 참조하십시오. –

+0

또한 조합 수는 예상보다 길어서 알고리즘이 정확할 수도 있습니다. [_huge; _] (https://en.wikipedia.org/wiki/Binomial_coefficient#Binomial_coefficients_as_polynomials) – 9000

답변

0

당신은 큰 입력 크기에 중단됩니다 코드에서 두 가지가 있습니다.

먼저 findsubsets 함수를 호출하면 itertools.combinations이 호출되어 결과가 집합으로 변환됩니다. itertools.combinations의 결과는 생성기로서 각 조합을 한 번에 하나씩 저장하거나 한 번에 모두 계산하지 않습니다. 이것을 집합으로 변환하면, 파이썬이 모든 것을 한꺼번에 계산하고 저장하도록 강요합니다. 따라서 라인 return set(itertools.combinations(S, m))은 프로그램이 중단되는 곳에서 거의 확실합니다. 그 라인의 직전과 직후에 print 서술문 (또는 다른 종류의 로깅 서술문)을 놓음으로써 확인할 수 있으며, 앞의 인쇄물을 보았을 때 후행하는 것을보기 전에 프로그램이 멈 추면 문제가 발견되었습니다. 해결책은 조합을 세트로 변환하지 않는 것입니다. 생성기로 남겨두면 필요한 경우 프로그램이 한 번에 하나의 조합을 가져올 수 있습니다.

두 번째로, 방금 제안한 내용을 수행하더라도 루프 for sub in Subset:은 모든 조합을 사용하는 상당히 단단한 루프입니다. 입력 크기가 크면 루프가 매우 오랜 시간이 걸리고 이전 단락을 구현하면 도움이되지 않습니다. 아마도 큰 입력 크기를 피하기 위해 프로그램을 재구성하거나 적어도 루프 중에 어떤 종류의 진행 상황을 보여 주어야합니다. 조합은 has a predictable output size의 기능을하므로 진행률 막대에서 완료율을 표시 할 수도 있습니다.

itertools.combinations에는 올바르게 사용할 때 필요하지 않으며 생성기를 세트로 로깅하지 않습니다. 필요에 따라 자신 만의 긴밀한 루프에서 로깅을 구현할 수 있습니다.

+0

감사합니다. @Rory. 네 말이 맞습니다. 이미 로그 문을 넣었고'return set (itertools.combinations (S, m))'이 걸려있는 곳임을 확인할 수 있습니다.제안 된 솔루션을 사용하여 문제가 해결되는지 확인해 보겠습니다. 이걸 시험해보고 작동하면 upvote :) –