728x90
반응형
학교에서 거의 처음으로 배우는 루프는 거의 모든 프로그래밍 언어에서 루프에 대해 배운다. 그래서 기본적으로 반복 작업이 있을 때마다 루프로 구현을 했던것 같다. 최근에 데이터를 처리하게 되면서 많은 수의 반복(수백만/수십억 행)으로 작업할 때 루프를 사용하는 것은 부담이 됐었다. 그래서 배웠지만 잘 안쓰고 있던 numpy를 사용하여 일을 진행하게 되었다. 여기에 대해서 잊어버리지 않게 적어보려고 한다.
import time
start = time.time()
# iterative sum
total = 0
# iterating through 1.5 Million numbers
for item in range(0, 1500000):
total = total + item
print('sum is:' + str(total))
end = time.time()
print(end - start)
#1124999250000
#0.14 Seconds
import numpy as np
start = time.time()
# vectorized sum - using numpy for vectorization
# np.arange create the sequence of numbers from 0 to 1499999
print(np.sum(np.arange(1500000)))
end = time.time()
print(end - start)
##1124999250000
##0.008 Seconds
간단하게 단순 덧셈인 코드인데도 불구하고, 벡터화는 범위 함수를 사용한 반복에 비해 실행 시간이 약 18배 더 짧다. 이 차이는 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'))
df.shape
# (5000000, 5)
df.head()
먼저 비교해보기 위해 데이터프레임을 만들었다.
import time
start = time.time()
# Iterating through DataFrame using iterrows
for idx, row in df.iterrows():
# creating a new column
df.at[idx,'ratio'] = 100 * (row["d"] / row["c"])
end = time.time()
print(end - start)
### 109 Seconds
start = time.time()
df["ratio"] = 100 * (df["d"] / df["c"])
end = time.time()
print(end - start)
### 0.12 seconds
DataFrame을 사용하면 엄청나게 빨라질 수 있다. 벡터화 작업에 소요되는 시간은 for문에 비해 1000배정도 빠르다.
import time
start = time.time()
# Iterating through DataFrame using iterrows
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)
### Time taken: 177 seconds
start = time.time()
df['e'] = df['b'] + df['c']
df.loc[df['a'] <= 25, 'e'] = df['b'] -df['c']
df.loc[df['a']==0, 'e'] = df['d']end = time.time()
print(end - start)
## 0.28007707595825195 sec
벡터를 사용하여 코딩하는게 if-else 문을 사용하는 for문에 비해 600배 빠르다.
나도 아직 제대로 공부를 안해서 사용하기에 어렵고, 제대로 알려주기도 문제가 있지만 대용량 데이터를 사용하는건 시간문제이기 때문에 공부를 많이 해서 자원을 아껴야겠다고 느꼈다.
728x90
반응형
'개발 > AI 공부' 카테고리의 다른 글
파이썬 각종 OCR 사용해보기 및 네이버 클라우드 AI OCR 사용법 (2) (0) | 2023.04.05 |
---|---|
머신러닝(CatBoost, LightGBM, XGBoost) 공부하기 (0) | 2023.03.14 |
AI 표준화에 대해서 (0) | 2023.03.13 |
댓글