완전 기초부터 시작하는 파이썬
행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리 할 수 있도록 지원하는 파이썬의 라이브러리
이번엔 numpy를 활용한 연산을 진행했을 때 다른점을 알아보고자 동일한 숫자의 합이 연산되는 속도를 비교해보았다.
예제 1
for문을 활용한 무작위로 생성된 배열의 합
# 무작위 배열의 합
import numpy as np
import time
start_time = time.time()
input_arr = np.random.randint(0, 10, 100000000)
# for code
sum_val = 0
for val in input_arr:
sum_val += val
print("합 : ", sum_val)
end_time = time.time()
for_time = end_time - start_time
print("수행시간 : ", for_time)
결과
합 : 449944158
수행시간 : 21.721976041793823
numpy를 활용한 코드
# numpy code
start_time = time.time()
input_arr = np.random.randint(0, 10, 100000000)
print()
end_time = time.time()
np_time = end_time - start_time
print("수행시간 : ", np_time)
결과
수행시간 : 2.6243231296539307
for을 활용한 코드와 numpy를 활용한 코드로 같은 연산을 했을 때의 연산 시간 비교
print("수행시간 비율 : ", for_time / np_time)
결과
수행시간 비율 : 8.277172805567696
for문을 활용했을 때 간단한 합연산을 진행한 결과 수행시간이 numpy를 이용한 합연산보다 약 8배 많은 시간을 소요했다는 것을 결과로 알 수 있었다.
예제 2
# 최대 최소값 구하기
import numpy as np
import time
start_time = time.time()
input_arr = np.random.randint(-12, 10, 900000)
# for문 활용
max_val, min_val = None, None
for val in input_arr:
if max_val == None or val > max_val:
max_val = val
if min_val == None or val < min_val:
min_val = val
end_time = time.time()
for_time = end_time - start_time
print(max_val, min_val)
start_time = time.time()
# numpy 활용
max_val = input_arr.max()
min_val = input_arr.min()
end_time = time.time()
np_time = end_time - start_time
print(max_val, min_val)
print(for_time)
print(np_time)
print(for_time / np_time)
9 -12
9 -12
0.2864990234375
0.0008158683776855469
351.1583869082408
for문을 통한 일반적인 활용방법보다 numpy에 내장되어 있는 함수로 코드를 구성하는 것이 예제 2번에서는 351배의 속도차이가 있다는 것을 확인할 수 있었다.
예제 3
# 랜덤한 배열에서 최대 최소값이 어느 위치에 있는지 찾기
import numpy as np
input_arr = np.random.randint(0, 1000, 1000)
# for문 활용
M, m = None, None
M_idx, m_idx = 0, 0
for val_idx in range(len(input_arr)):
if M == None or input_arr[val_idx] > M:
M = input_arr[val_idx]
M_idx = val_idx
if m == None or input_arr[val_idx] < m:
m = input_arr[val_idx]
m_idx = val_idx
print(M, M_idx, m, m_idx)
# numpy 활용
M = input_arr.max()
m = input_arr.min()
M_idx = np.argmax(input_arr)
m_idx = np.argmin(input_arr)
print(M, M_idx, m, m_idx)
결과
997 27 1 787
997 27 1 787
이러나 저러나 본인은 for문을 먼저 익숙하게 활용해야 할 것 같다. ㅎㅎ..