코드에 성능 문제가 있습니다. 단계 # IIII
시간을 소모합니다. 전에 itertools.prodct을 구체화하는 데 사용했지만 사용자 덕분에 더 이상 pro_data = product(array_b,array_a)
을 수행하지 않습니다. 이것은 메모리 문제를 해결하는데 도움이되었지만 여전히 많은 시간을 필요로합니다. 멀티 스레딩 또는 멀티 프로세싱으로 병렬화하고 싶습니다. 무엇이든 제안 할 수있어서 감사합니다.반복을 통한 루프 평행화
설명. 입자의 x와 y 값을 포함하는 두 개의 배열이 있습니다. 각 입자 (두 좌표로 정의)에 대해 다른 함수로 함수를 계산하려고합니다. 조합을 위해 itertools.product 메서드를 사용하고 모든 입자 위로 반복합니다. 나는 총 50000 개 이상의 입자를 처리하므로 계산할 N * N/2 개의 조합이 있습니다. 사전에
감사
import numpy as np
import matplotlib.pyplot as plt
from itertools import product,combinations_with_replacement
def func(ar1,ar2,ar3,ar4): #example func that takes four arguments
return (ar1*ar2**22+np.sin(ar3)+ar4)
def newdist(a):
return func(a[0][0],a[0][1],a[1][0],a[1][1])
x_edges = np.logspace(-3,1, num=25) #prepare x-axis for histogram
x_mean = 10**((np.log10(x_edges[:-1])+np.log10(x_edges[1:]))/2)
x_width=x_edges[1:]-x_edges[:-1]
hist_data=np.zeros([len(x_edges)-1])
array1=np.random.uniform(0.,10.,100)
array2=np.random.uniform(0.,10.,100)
array_a = np.dstack((array1,array1))[0]
array_b = np.dstack((array2,array2))[0]
# IIII
for i in product(array_a,array_b):
(result,bins) = np.histogram(newdist(i),bins=x_edges)
hist_data+=result
hist_data = np.array(map(float, hist_data))
plt.bar(x_mean,hist_data,width=x_width,color='r')
plt.show()
----- 편집 ----- 는 지금이 코드를 사용 : 여기
def mp_dist(array_a,array_b, d, bins): #d chunks AND processes
def worker(array_ab, out_q):
""" push result in queue """
outdict = {}
outdict = vec_chunk(array_ab, bins)
out_q.put(outdict)
out_q = mp.Queue()
a = np.swapaxes(array_a, 0 ,1)
b = np.swapaxes(array_b, 0 ,1)
array_size_a=len(array_a)-(len(array_a)%d)
array_size_b=len(array_b)-(len(array_b)%d)
a_chunk = array_size_a/d
b_chunk = array_size_b/d
procs = []
#prepare arrays for mp
array_ab = np.empty((4, a_chunk, b_chunk))
for j in xrange(d):
for k in xrange(d):
array_ab[[0, 1]] = a[:, a_chunk * j:a_chunk * (j + 1), None]
array_ab[[2, 3]] = b[:, None, b_chunk * k:b_chunk * (k + 1)]
p = mp.Process(target=worker, args=(array_ab, out_q))
procs.append(p)
p.start()
resultarray = np.empty(len(bins)-1)
for i in range(d):
resultarray+=out_q.get()
# Wait for all worker processes to finish
for pro in procs:
pro.join()
print resultarray
return resultarray
문제는 내가 프로세스의 수를 제어 할 수 있다는 것입니다 . 대신 mp.Pool()
을 사용할 수 있습니까? 보다
글을 그대로 업데이트하여 구문/들여 쓰기가 정확하도록 게시물을 업데이트 할 수 있습니까? 몇 줄을 추가하여 array1 및 유사한 변수의 예제를 생성하십시오. 사람들은 당신의 질문에 답하는 데 시간을 할애 할 가능성이 훨씬 적습니다 ... – YXD
나는 몇 배의 스피드 업을 위해서 [Cython] (http://wiki.cython.org/tutorials/numpy)을 살펴 보시기 바랍니다. Python과 Numpy로 병렬 처리하는 것은 그리 쉬운 일이 아닙니다. –
1)'newdist1'이 대칭이면 각 쌍을 한 번만 가져옴으로써 시간을 반으로 줄일 수 있습니다. 2) 여러 프로세스에 걸쳐 작업을 분산시키기 위해'다중 처리 '(다중 처리가 아닌)를 사용할 수 있습니다. 가장 단순한 방법은 각각 프로세스가'i'의 값을 얻고 집계를 유지하는'프로세스 풀 (pool) '을 만드는 것입니다. 그물에 많은 예제가 있으므로, 그냥 사용해보십시오. 3) 그게 충분하지 않다면, 실제로, cython이 있습니다. –