python numpy axis performance 관련 질문
조회수 1145회
안녕하세요
numpy 는 default로 row major order로 배열을 생성시켜 줍니다.
따라서 row를 따라 계산하는 것이 더 빠른것이 자연스러운데요.
numpy 에서 제공된는 sum이나 mean 같은 함수를 사용시 잘 이해가 안되는 결과가 나와서 질문드립니다.
아래 예제를 보시면
a = np.array([[1,2,3],
[4,5,6],
[7,8,9]], order='C')
print(a.sum(axis=1))
[ 6 15 24]
이 경우 a.sum(axis=1)이 row를 따라 계산하는 것입니다. 아래와 같이요.
a[0,:].sum(), a[1,:].sum(), a[2,;].sum()
반면 a.sum(axis=0)은 column을 따라 계산하는 것이기 때문에 a.sum(axis=0) 보다 계산 속도가 느려야 할 것으로 생각됩니다. 하지만 아래와 같은 테스트 상황에서는 반대 결과가 나오는데요.
a = np.random.rand(5000, 5000)
%timeit a.sum(axis=1)
29.7 ms ± 231 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit a.sum(axis=0)
16.9 ms ± 82.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
보시는 것 처럼 column을 따라 계산한 것이 더 빠릅니다.
반면에 하나의 row 나 column을 잡아서 계산하면 row를 따라 계산한것이 더 빠르게 나옵니다.
%timeit a[0,:].sum()
3.41 µs ± 4.91 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit a[:,0].sum()
38.7 µs ± 31.8 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
이것을 어떻게 설명할 수 있을지요?
anaconda python 3.6.3을 사용하였으며 윈도우에서 테스트한 것입니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력