[python][자료구조] Python의 Loop? NO! , Python의 Vectorization? OK!!!

소개

프로그래밍에서 루프는 매우 자연스럽고,

거의 모든 프로그래밍 언어로 루프에 대해 배웁니다.

 

기본적으로 반복 작업이 있을 때마다

루프를 사용합니다.

 

하지만 엄청나게 많은 수의

반복(수백만/수십억 행)으로 작업할 때

루프를 사용하는 것은 별로 좋은 방법이 아닙니다.

 

나중에 작동하지 않는다는 것을 깨닫기 위해

몇 시간 동안 갇혀있을 수 있습니다.

그렇기 때문에 파이썬에서는

벡터화를 구현하는 것이 매우 중요합니다.

 

 

벡터화(Vectorization)란?

벡터화는 데이터 세트에서 

(NumPy) 배열 작업을 구현하는 기술입니다. 

 

백그라운드에서 한 번에 하나의 행을 조작하는 

'for' 루프와 달리 한 번에 배열(array) 또는 시리즈(Series)의 

모든 요소에 작업을 적용합니다.

이번 포스팅에서는 파이썬 루프를

벡터화로 쉽게 대체할 수 있는

몇 가지 사용 사례를 살펴보겠습니다.

 

이렇게 하면 시간을 절약하고

코딩에 더 능숙해질 수 있습니다.

 

사용 사례 1: 숫자의 합 찾기

먼저 파이썬에서 루프와 벡터화를 사용하여

숫자의 합을 구하는 기본적인 예제를 살펴보겠습니다.

루프 사용 예

import time 
start = time.time()


# for 루프를 활용한 합계 구하기
total = 0

for item in range(0, 60000):
    total = total + item


print('sum is:' + str(total))
end = time.time()

print('소요 시간(초) :', end - start)

 

 

 

벡터화 사용

import numpy as np

start = time.time()

print(np.sum(np.arange(60000)))

end = time.time()

print('소요 시간(초) :', end - start)

 

 

 

벡터화 연산과 range 함수를 사용한 반복 연산을

비교해 볼 때, 약 8배 빠른 속도를 보여 주었습니다.

 

이 차이는 Pandas DataFrame으로

작업하는 동안 더욱 중요해집니다.

 

사용 사례 2: 수학 연산(DataFrame에서)

데이터 과학에서 Pandas DataFrame으로 

작업하는 동안 개발자는 루프를 사용하고,

수학 연산을 사용하여 새로운 파생 열을 만듭니다.

다음 예에서는 이러한 사용 사례에서 

루프를 벡터화로 얼마나 쉽게 

변경할 수 있는지 확인할 수 있습니다.


데이터프레임 생성

DataFrame은 행과 열 형식의

테이블 형식 데이터입니다.

0에서 50 사이의 임의의 값으로 채워진

5백만 행과 4개의 열이 있는

pandas DataFrame을 만들겠습니다.

 

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0, 50, size=(5000000, 4)), columns=('a','b','c','d'))

print(df.shape)

df.head()

 

 

 

열 'd'와 'c'의 비율을 찾기 위해 새 열 'ratio'을 만듭니다.

 

루프 사용

import time 
start = time.time()


for idx, row in df.iterrows():

    df.at[idx,'ratio'] = 100 * (row["d"] / row["c"])  
    
end = time.time()

print(end - start)

 

 

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

벡터화 사용

start = time.time()
df["ratio"] = 100 * (df["d"] / df["c"])

end = time.time()
print(end - start)

 

 

 

DataFrame에서 상당한 개선을 볼 수 있습니다. 

벡터화 작업에 걸리는 시간은 

Python의 루프에 비해 거의 1000배 더 빠릅니다.

 

 

사용 사례 3: If-else 문(DataFrame에서)

'If-else' 유형의 논리를 사용해야 하는

많은 코딩 작업이 있습니다.

 

이러한 논리를 파이썬의 벡터화 작업으로

쉽게 대체할 수 있습니다.

다음 예를 살펴보겠습니다

(사용 사례 2에서 생성한 DataFrame을 사용합니다).

기존 열 'a'의 일부 조건을 기반으로 

새 열 'e'를 만들고 싶다고 가정합니다.

 

루프 사용

import time 
start = time.time()

for idx, row in df.iterrows():
    if row.a == 0:
        df.at[idx,'e'] = row.d    
    elif (row.a <= 25) & (row.a > 0):
        df.at[idx,'e'] = (row.b)-(row.c)    
    else:
        df.at[idx,'e'] = row.b + row.c

end = time.time()

print('소요 시간(초): ', end - start)

 

벡터화 사용

 

벡터화 작업에 소요되는 시간은 if-else 문이 있는 

파이썬 루프에 비해 600배 더 빠릅니다.

 

사용 사례 4(고급): 머신 러닝/딥 러닝 네트워크 해결

딥 러닝을 사용하려면 수백만, 수십억 행에 대해 

여러 복잡한 방정식을 풀어야 합니다. 

 

이러한 방정식을 풀기 위해 

파이썬에서 루프를 실행하는 것은

매우 느리기 때문에 벡터화가 최적의 솔루션입니다.

예를 들어 다음과 같은 다중 선형 회귀 방정식에서 

수백만 행에 대한 y 값을 계산하려면 

다음과 같이 수행하세요.

 

 

 

 

루프를 벡터화로 대체할 수 있습니다.

m1,m2,m3…의 값은 x1,x2,x3…에 해당하는 

수백만 개의 값을 사용하여 

위의 방정식을 풀면 결정됩니다.

(단순화를 위해 간단한 곱셈 단계만 살펴보겠습니다).

 

데이터 생성

import numpy as np

# 0과 1 사이의 1 by 5 배열의 난수 생성 
m = np.random.rand(1,5)
m

 

 

# input values for 5 million rows
x = np.random.rand(5000000,5)
x

 

 

 

루프 사용

import numpy as np
import time
m = np.random.rand(1,5)
x = np.random.rand(5000000,5)

total = 0
tic = time.process_time()
zer = np.repeat(0,5000000)

for i in range(0,5000000):
    total = 0
    for j in range(0,5):
        total = total + x[i][j]*m[0][j] 
        
    zer[i] = total 

toc = time.process_time()
print ("Computation time = " + str((toc - tic)) + "seconds")

 

 

 

벡터화 사용

tic = time.process_time()

# 행렬 곱
np.dot(x,m.T) 

toc = time.process_time()
print ("Computation time = " + str((toc - tic)) + "seconds")

 

 

np.dot는 백엔드에서 벡터화된 행렬 곱셈을 구현합니다. 

파이썬의 루프에 비해 약 73배 빠릅니다.

 

결론

Python의 벡터화는 매우 빠르기 때문에

매우 큰 데이터를 다룰 때는

루프 대신 벡터화를 주로 사용해야 합니다.

처음에는 익숙하지 않을 수도 있지만,

시간이 지남에 따라 구현을 시작하면

벡터화 방식으로 생각하는 데 익숙해질 것입니다.

[출처] https://zzinnam.tistory.com/entry/Python%EC%9D%98-Loop-NO-Python%EC%9D%98-Vectorization-OK

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
142 [Python 인터넷] PM2로 Python Flask 앱 관리하기 : Managing Python Flask App with PM2 file 졸리운_곰 2025.01.08 452
141 [Python 인터넷] Telegram bot! 봇 만들기 with 파이썬 file 졸리운_곰 2024.06.19 531
140 [Python 인터넷] python-screenshot-to-FTP /screengrab.py 졸리운_곰 2024.06.07 389
139 [Python 인터넷] IP 주소를 찾는 Python 프로그램 file 졸리운_곰 2024.06.07 365
138 [Python 인터넷] python 을 사용한 instagram (인스타그램) 자동 포스팅 : Automate Instagram Posts with Python: A Step-by-Step Guide 졸리운_곰 2024.05.19 317
137 [Python 인터넷] python 을 사용한 instagram (인스타그램) 자동 포스팅 : Automating Instagram Posts with Python: A Quick Guide file 졸리운_곰 2024.05.19 374
136 [Python 인터넷] 파이썬 셀레늄 네이버 포스트 자동 포스팅 방법 졸리운_곰 2024.05.05 442
135 [Python 인터넷] websocket을 이용한 python server에 대용량 파일 전송하기 졸리운_곰 2023.12.14 310
134 [Python 인터넷] [Python] Websocket을 사용하는 방법 file 졸리운_곰 2023.12.12 321
133 [Python 인터넷] 네이버 뉴스 기사 크롤링 졸리운_곰 2023.05.13 462
132 [Python 인터넷] 웹 페이지를 mhtml로 저장하기 python web page save as mthml 졸리운_곰 2023.04.12 448
131 [Python 인터넷] 16 - 셀레니움 이미지 크롤링, 스크롤 다운 file 졸리운_곰 2023.04.06 259
130 [Python 인터넷] 15 - 셀레니움 크롤링 (input) file 졸리운_곰 2023.04.06 406
129 [Python 인터넷] 14 - 셀레니움 click file 졸리운_곰 2023.04.06 538
128 [Python 인터넷] 13 - 셀레니움 사용해보기 file 졸리운_곰 2023.04.06 358
127 [Python 인터넷] 12 - 데이터 엑셀로 저장 file 졸리운_곰 2023.03.31 334
126 [Python 인터넷] 11 - Page 숫자 설정 file 졸리운_곰 2023.03.31 387
125 [Python 인터넷] 10 - 다음 뉴스 키워드로 크롤링 file 졸리운_곰 2023.03.30 363
124 [Python 인터넷] 9 - Flask POST file 졸리운_곰 2023.03.30 489
123 [Python 인터넷] 8 - 약간의 레이아웃 설정하기 file 졸리운_곰 2023.03.30 347
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED