Goal
1. λ₯λ¬λμμ 벑ν°ν(vectorization)μ μ₯μ μμ보기
2. νμ΄μ¬μ λ€μν 벑ν°ν μ°μ° μ½λ μμ보기
벑ν°ν(Vectorization)μ μ¬μ©νλ μ΄μ
λ₯λ¬λμμ μμ² λ§μ μμ λ°μ΄ν°λ₯Ό λ€λ£¨κ² λλ€. μ΄ λ, λ§μ μμ λ°μ΄ν°κ°μ κ³±μ μ κ°μ μ΄λ€ μ°μ°μ νκ² λλ©΄ μκ°μ΄ λ무 μ€λ 걸리λκ² ν° λ¬Έμ κ° λλ€.
μλ₯Ό λ€μ΄, κ°κ° λ°±λ§κ°μ μ«μλ₯Ό κ°μ§ aμ b λ°°μ΄μμ aμ bκ°μ λͺ¨λ μ«μλ₯Ό κ³±νμ¬ λν΄μΌνλ€λ©΄ μΌλ°μ μΌλ‘λ forλ¬Έμ ν΅ν΄ ν μ μμ κ²μ΄λ€. νμ§λ§ μκ°μ΄ λ무 μ€λ 걸리기 λλ¬Έμ μ΄λ΄ λ νμ΄μ¬ numpy λΌμ΄λΈλ¬λ¦¬μ λ΄μ λμ΄ μλ λ²‘ν° ν¨μλ€μ μ¬μ©νλ©΄ μμ£Ό λΉ λ₯΄κ² κ°μ μμ μ μνν μ μλ€!
import numpy as np
import time
a = np.random.rand(1000000) # λ°±λ§κ°μ 0~1 μ¬μ΄μ μ«μ
b = np.random.rand(1000000) # λ°±λ§κ°μ 0~1 μ¬μ΄μ μ«μ
### forλ¬Έμ μ¬μ© ###
c = 0
start = time.time() # μμμκ°
for i in range(1000000):
c += a[i]*b[i]
end = time.time() # μ’
λ£μκ°
print(c)
print("For loop: " + str(1000*(end-start)) + "ms")
print("\n")
### 벑ν°λ₯Ό μ¬μ© ###
start = time.time() # μμμκ°
c = np.dot(a,b)
end = time.time() # μ’
λ£μκ°
print(c)
print("Vectorized version: " + str(1000*(end-start)) + "ms")
*** Forλ¬Έ λ²μ ***
249852.61979416214
For loop: 441.72096252441406ms
*** 벑ν°ν λ²μ ***
249852.6197941607
Vectorized version: 3.0107498168945312ms
μμ κ²°κ³Όλ₯Ό 보면 벑ν°νν μ½λμμλ 3.01 ms λ°μ κ±Έλ¦¬μ§ μμμ§λ§ κ°μ μμ μ forλ¬Έμ ν΅ν΄ μ§ννμ λ λ¬΄λ € 100λ°°κ° λλ 441.72 msκ° κ±Έλ Έλ€! μ΄ ν μ€νΈλ λ°±λ§κ°μ λ°μ΄ν°λ‘ μ§ννμ λ κ²°κ³Όμ§λ§ μ€μ λ₯λ¬λ λͺ¨λΈμ νμ΅ν λμλ ν¨μ¬ λ λ§μ μμ λ°μ΄ν°λ₯Ό μ¬μ©νκΈ° λλ¬Έμ μμ²λ μ°¨μ΄λ₯Ό λΆλ¬μΌμΌν¨λ€.
λ€λ₯Έ 벑ν°ν μ°μ° λ°©λ²
import numpy as np
v = np.random.rand(1000000)
# eμ vμΉ (e^v)
v_exp = np.exp(v)
# vμ λ‘κ·Έκ°
v_log = np.log(v)
# vμ μ λκ°
v_abs = np.abs(v)
# vμ μ΅λκ°
v_max = np.maximum(v, 0)
# vμ μ κ³±κ°
v_sqr = v**2
# vμ μν¨μ
v_inv = 1/v
μμ κ°μ΄ νμ΄μ¬ numpy λΌμ΄λΈλ¬λ¦¬μλ λ§μ λ²‘ν° μ°μ° λ°©λ²μ΄ λ΄μ λμ΄ μλ€. μ μμλ³΄κ³ μ΄μ©ν΄λ³΄μ :)
μ°Έκ³
Andrew Ngμ λ₯λ¬λ κ°μ - https://www.coursera.org/learn/neural-networks-deep-learning/lecture/NYnog/vectorization
λκΈ