SiLaure's Data

[Numpy] Performance Test 본문

Records of/Learning

[Numpy] Performance Test

data_soin 2021. 7. 25. 17:07

 

- 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" 이 생긴다.

 

 

 

Comments