for
루프를 사용한 리스트와 NumPy 배열에서 벡터화된 연산 간의 성능 차이는 몇 가지 주요 이유로 인해 발생합니다:¶for
루프를 사용하면 반복문을 통해 각 요소에 접근하고 연산을 수행해야 합니다. 이는 반복문의 오버헤드와 Python 인터프리터의 각 반복에서 추가적인 작업이 필요하므로 느린 성능을 초래합니다.¶for
루프를 사용한 리스트보다 빠릅니다.¶import numpy as np
import time
import pandas as pd
import timeit
# %%timeit -n 5 -r 2
start_time = time.time()
lst = range(1, 1000001)
squared_lst = [x**2 for x in lst]
gap_time_list = time.time() - start_time
squared_lst[-1],gap_time_list
(1000000000000, 0.49983978271484375)
# %%timeit -n 5 -r 2
start_time = time.time()
arr = np.arange(1, 1000001,dtype='int64')
squared_arr = arr**2
gap_time_arr = time.time() - start_time
squared_arr[-1],gap_time_arr
(1000000000000, 0.014994621276855469)
f'numpy가 list 보다 {gap_time_list/gap_time_arr:0.1f}배 빠름'
'numpy가 list 보다 33.3배 빠름'
import pandas as pd
import random
genres=['Adventure', 'Animation', 'Children', 'Comedy', 'Fantasy', 'Romance', 'Drama', 'Action', 'Crime', 'Thriller', 'Horror',
'Mystery', 'Sci-Fi', 'War', 'Musical', 'Documentary', 'IMAX', 'Western', 'Film-Noir']
data = []
num_rows = 5000
random.seed(1234)
for _ in range(num_rows):
num_genres = random.randint(1, 6) # 임의의 장르 개수 선택 (1개부터 4개)
random_genres = random.sample(genres, num_genres) # 임의로 선택된 장르 조합
combined_genres = '|'.join(random_genres) # 장르들을 하나의 문자열로 결합
data+=[combined_genres]
df = pd.DataFrame(data, columns=['Combined_Genres']) # 데이터프레임 생성
# %%time
start_time = time.time()
zero_matrix=np.zeros((len(df),len(genres)))
dummies=pd.DataFrame(zero_matrix,columns=genres)
for i, gen in enumerate(df.Combined_Genres):
indices=dummies.columns.get_indexer(gen.split('|'))
dummies.iloc[i,indices]=1
movies_windic=df.join(dummies.add_prefix('genre_'))
# movies_windic
gap_time_df = time.time() - start_time
gap_time_df
1.6244792938232422
# %%time
start_time = time.time()
gen=df.iloc[:,0].str.split('|')
matrix = np.zeros((len(df), len(genres)), dtype=int)
genre_to_idx = {genre: idx for idx, genre in enumerate(genres)}
for i in range(len(df)):
for item in gen[i]:
idx = genre_to_idx.get(item)
matrix[i, idx] = 1
prefix_genres=['genre_'+x for x in genres]
matrix_df=pd.DataFrame(matrix,columns=prefix_genres)
new_movies=df.join(matrix_df)
# new_movies.iloc[:,3:-1]=matrix_df
gap_time_np = time.time() - start_time
gap_time_np
0.05196881294250488
print(f'결과값 비교: {"같음" if (movies_windic==new_movies).all().all() else "다름"}')
print(f'numpy가 pandas 보다 {gap_time_df/gap_time_np:0.1f}배 빠름')
결과값 비교: 같음
numpy가 pandas 보다 31.3배 빠름
[데이터 사이언스] (전처리) pd.melt 여러 컬럼을 하나의 컬럼으로 합치고 컬럼 이름 붙여 grouping 하기 (미니탭 컬럼 합치기, 쌓기) (0) | 2023.12.19 |
---|---|
[데이터 사이언스] (전처리) Pandas 판다스 특정 type 열 선택 (0) | 2023.12.12 |
[데이터 사이언스] (전처리) 특정 값이 있는 컬럼의 이름을 저장하는 코드 (0) | 2023.12.05 |
[데이터 사이언스] 판다스 데이터프레임 색인 문법 비교 (0) | 2023.10.12 |
[데이터 사이언스] DataFrame 비교 함수 차이(isin, str.contains, str.match) (0) | 2023.09.25 |
댓글 영역