2016-06-23 3 views
1

많은 수의 반복에도 큰 배열을 곱할 수 있습니다.파이썬에서 대형 배열을 곱하면

나는 약 1500 길이의 배열로 모델을 훈련하고 거의 1000000 시간 동안 3 번의 곱셈을 수행 할 것이다.

나는 DASK 발견 나는 정상적인 NumPy와 방법을 비교하려고하지만 난 빨리 NumPy와 발견

x = np.arange(2000) 

start = time.time() 
y = da.from_array(x, chunks=(100)) 

for i in range (0,100): 
    p = y.dot(y) 

#print(p) 
print(time.time() - start) 

print('------------------------------') 

start = time.time() 

p = 0 

for i in range (0,100): 
    p = np.dot(x,x) 

print(time.time() - start) 

0.08502793312072754

0.00015974044799804688

내가 또는 잘못된 DASK를 사용하고 그것은 그렇게 질색입니다.

답변

2

.dot의 성능은 NumPy 구현이 연결된 BLAS library에 따라 크게 달라질 수 있습니다.

OpenBLAS 또는 MKL과 같은 최신 구현이있는 경우 NumPy는 이미 모든 코어를 사용하여 최대 속도로 실행 중입니다. 이 경우에 dask.array은 아무런 보장이 없을 때 병렬 처리를 추가하려고 시도하면서 스레드 경합을 유발할 가능성이 높습니다.

Anaconda를 통해 NumPy를 설치 한 경우 이미 OpenBLAS 또는 MKL을 사용하고 있으므로 성능에 만족하고 하루 만 부르면됩니다.

그러나 실제로는 너무 작은 청크를 사용하고 있습니다 (chunks=(100,)). dask 작업 스케줄러는 작업 당 약 1 밀리 초의 오버 헤드를 발생시킵니다. 이 오버 헤드를 숨기려면 각 작업이 밀리 초 단위로 수행되도록 청크를 선택해야합니다. 일반적으로 엄지 손가락의 좋은 규칙은 크기가 메가 바이트 이상인 청크를 목표로 삼는 것입니다. 이것이 현재보고있는 성능의 큰 차이를 일으키는 원인입니다.

+0

나는 덩어리를 늘렸고, 최고는 0.054로 여전히 Numpy와는 거리가 멀다. 당신이 말한 것처럼, Numpy는 이미 병렬 처리되어 있습니다. 자세한 설명을 주셔서 감사합니다. 지금은 더 명확합니다. –

+0

예, 작은 빠른 문제의 경우 병렬 컴퓨팅 프레임 워크의 오버 헤드가 일반적으로 도움이되는 것보다 많습니다. – MRocklin