2013-08-06 5 views
0

저는 PyMC를 사용하여 MCMC 계산을하고 있습니다. 내 데이터는 각각 24 * 1000 모양의 47 부분으로 구성됩니다.파이썬 다중 프로세스 루프

MCMC가 작동하려면 47 개 부품 중에서 큰 어레이를 생성 했으므로 이제는 (1128) * 1000 어레이를 보유하게됩니다.

그러면 맞는 모델은 동일한 크기의 배열을 만듭니다. 47 개의 각 부분에 대해로드해야하는 다른 값 (배율 인수 등)이 있으므로 루프에서이를 수행합니다.

말할 수 있습니다지도 내 배열 : 47 개 부품은 서로 독립적이기 때문에 내가 멀티 프로세싱을 사용하는 경우

for i in range(len(map[::])/47): 

    scale = scale_all[i] 

    self.trans_calc["t"] = 0. 
    self.trans_calc.xyzPos() 
    pos0 = self.trans_calc.calc_pos1() 

    for k in range(24): 

    self.trans_calc["t"] = self.time[k]    
    self.trans_calc.xyzPos() 

    if self.trans_calc.onstar() == False: 

     curve = pos0 

    else: 

     pos1 = self.trans_calc.calc_pos1() 
     curve = pos0 - pos1 + 1.0 * scale 

    map[k+i*47] = curve 

return map 

가 나는 속도 향상을 얻을 것입니다.

지도에서 올바른 위치에 글을 쓸 수 있도록 설정하는 방법을 모르겠다. 해결책을 찾았지만 찾지 못했습니다. 아니면 내가 찾은 것을 이해하지 못했습니다.

답변

0

저는 PyMC에 대한 경험이 없기 때문에 코드에서 정확히 무엇을하는지 볼 수 없습니다. 그러나 프로세스가 독립적 인 경우 결과를 반환하는 함수에서 체인의 모든 부분을 '매핑'할 수있는 방식으로 스크립트를 작성해야합니다.

from multiprocessing import Pool 
pool = Pool(processes=8)    
result = pool.map(build_markov_chain, list_of_input_arrays) 

이렇게하면 결과는 입력과 같은 순서로됩니다. 따라서 (1128) * 1000 배열을 작성하는 대신 모양 24 * 1000의 배열 47 개를 포함하는 목록으로 유지하는 것이 좋습니다.

+0

Markov가 작동하려면 모든 것을 한 단계에서 계산해야합니다. 그게 내가이 큰 배열을 만드는 이유입니다. 코드 예제는 느린 종류의 루프를 사용하여 모델 배열을 만드는 방법을 보여줍니다. 마르코프에는 각 단계에서 모델 배열에 영향을주는 몇 가지 자유 매개 변수가 있습니다. 그래서 각 마르코프 단계는 배열이 새롭게 만들어지고 경험적인 데이터와 비교됩니다. 데이터는 47 부분으로 구성됩니다. 각각에는 24 개의 subpart가 있습니다. 파트 1의 서브 파트 1은 파트 2의 서브 파트 1과 동일한 시간 정보를가집니다 (이를 정정 한 k 루프에 오류가 있음). –

+0

좋아, 다음과 같이하면 속도가 빨라진다. 나는 루핑을하는 여분의 프로그램을 만들기 위해 cython을 사용하고있다. pyhon 코드를 붙여 넣는 것만으로도 두 배 빠른 속도감을 얻을 수있었습니다. –

+0

좋아, 자네가 문제를 해결하는 중이 야. :-) – Basileios

관련 문제