2012-06-21 6 views
0

오일러 프로젝트 # 4에 대한 대답입니다.병렬 처리 할 수 ​​있습니까?

회문수는 같은 방법으로 읽습니다. 2 자리 숫자 두 자리의 곱으로 만들어진 최대 회문은 9009 = 91 99입니다.

두 자리 3 자리 숫자의 곱으로 만들어진 최대 회 전기를 찾으십시오.

답변 :

906609 

코드는 :이 실행할 때

from multiprocessing import Pool 
from itertools import product 

def sym(lst): 
    rst=[] 
    for x,y in lst: 
     tmp=x*y 
     if rec(tmp): 
      rst.append(tmp) 
    return rst 

def rec(num): 
    num=str(num) 
    if num == "".join(reversed(num)): return True 
    else: return False 

if __name__ == "__main__": 
    pool=Pool(processes=8) 
    lst=product(xrange(100,1000),repeat=2) 
    rst=pool.map(sym,lst) 
    #rst=sym(lst) 
    print max(rst) 

:

# TypeError:'int' object is not iterable 

하지만 난 그것을 이해할 수 없다 ... 반복자를 나열하지 않습니다 ? 또는 내 코드에 오류가 있습니까?

+2

목록은 반복 가능하며 목록을 전달하지 않는 것은 int임을 나타냅니다. – monkut

+0

전체 추적은 오류의 정확한 위치를 찾아내는 데 도움이되지만 원인은 오류 메시지에 설명되어 있으며 @monkut에 의해 지적되었습니다. – Levon

+0

여기에서 테스트했는데 이상한 오류 일 수 있습니다. 처리가 끝나기 전에 최대 결과를 인쇄하려는 시도와 함께하십시오 ... 반복을 제외하고 try/wrap을 감싸고 조금만 디버깅하려고 시도 할 수 있습니다. – monkut

답변

4

문제는 sym입니다.

sym은 제품 반복 가능 제품의 첫 번째 요소로 전달됩니다. (예 : lst = (100,100)). 당신이 for 루프에 도착하면, 당신은 lst 반복하고 두 개의 숫자로 압축을 해제하려는 -에 해당 : 분명한 이유 실패

for x,y in (100,100): 
    ... 

합니다.

아마 for 루프를 모두 없애고 싶다고 생각합니다. 아마도 직렬 버전의 아티팩트 일 것입니다.

def sym(lst): 
    x,y=lst 
    tmp=x*y 
    if rec(tmp): 
     return tmp 
    else: 
     return None #max will ignore None values since None > x is always False. 

역 추적

다소 비밀이었다 - 분명히 역 추적 한 다음 다시 제기 가져옵니다 Pool에 반환됩니다 ...하지만 그것을 수행하는 방법은 추적하기가 조금 어렵습니다.

가끔 디버깅 할 때 Pool.map()을 일반 버전 map으로 바꾸는 것이 좋습니다. 그런 다음 발생하는 모든 예외가 주요 "스레드"에서 발생하며 추적 기능이 조금 더 쉽게 따라갈 수 있습니다.

+0

그래, 그냥 여기뿐만 아니라 것으로 나타났습니다. [(100, 100), (100, 101), ...]을 매핑하여 전달하면 입력 값에서 하나의 값을 가져 와서 함수에 전달하므로 sym ((100, 100))가 전달됩니다. . – monkut

+1

+1 이러한 것들을 디버깅하려면 Pool.map()을 맵의 일반 버전으로 바꾸는 것이 도움이됩니다. –

+0

내가 얻을 수있는 가장 좋은 답변! 고맙습니다!! –