λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ€– Deep Learning/파이썬

파이썬 벑터 μ‚¬μš©ν•˜κΈ°

by HelloRabbit 2023. 5. 13.
728x90

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

 

λŒ“κΈ€