SiLaure's Data
[Numpy] Performance Test 본문
- Powerful Numpy
numpy array는 파이썬 리스트에 비해 연산이 빠르다.
broadcast, static type binding, fixed array size, ... 등의 vectorize 조건에서.
== 원소의 개수가 많을 때.
그렇다면 Numpy는 정말 얼마나 강력한가?
np.random.seed(0)
# Numpy array의 각 원소의 역수를 취하는 함수.
# values라고 하는 list 또는 numpy array를 받아서 해당하는 numpy array를 저장하는 함수로
# 하나씩 역수를 취해준다.
def reverse_num(values):
output = np.empty(len(values))
for i in range(len(values)):
output[i] = 1.0 / values[i]
return output
# Numpy array의 모든 원소의 합을 구하는 함수.
def cum_sum(values) :
total = 0
for num in values : # values에 있는 숫자를 num이라는 변수에 하나씩 받아서
total += num # total에 더해준다.
return total
# 1부터 100까지 범위에서 1000000개를 랜덤으로 뽑아서 array를 만든다.
# np.random.rand나 np.random.randn 을 사용해도 된다.
big_array = np.random.randint(1, 100, size=1000000)
big_array.shape
출력 : (1000000,)
%timeit : 해당 셀을 실행하는데 얼마나 시간이 걸리는지 측정해준다.
%timeit reverse_num(big_array)
출력 : 1.76 s ± 109 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit 1.0 / big_array
출력 : 3.9 ms ± 550 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit cum_sum(big_array)
출력 : 96.8 ms ± 1.91 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit np.sum(big_array)
출력 : 419 µs ± 3.52 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Q. 왜 numpy가 파이썬(정확히는 CPython)으로 구현한 함수를 통해 반복문을 수행한것보다 빠를까?
A1. 매번 반복할 때마다 *"type matching"* 과 *"function dispatching"* 을
파이썬 interpreter가 수행하기 때문에 "performance bottleneck" 이 생긴다.
'Records of > Learning' 카테고리의 다른 글
[Pandas] 03. DataFrame Method (0) | 2021.07.25 |
---|---|
[Pandas] 01. Pandas란 / 02. Pandas의 기본 자료구조(Series, DataFrame) (0) | 2021.07.25 |
[Numpy] 06. Array Aggregation functions (0) | 2021.07.25 |
[Numpy] 05. Array Functions(함수) (0) | 2021.07.25 |
[Numpy] 03. Array Operation(Broadcast, Universal Function) (0) | 2021.07.23 |
Comments