프로그래밍에서 반복문은 기본적이면서도 자주 사용되는 문법 중 하나이다. 그러나 같은 반복문이라도, 연산량을 어떻게 줄이느냐에 따라 프로그램의 성능에 큰 차이가 발생할 수 있다. 이번 포스팅에서는 pandas 의 Dataframe 을 다루면서, 반복문의 반복 횟수를 줄임으로써 얻을 수 있는 성능상 이득을 살펴보고자 한다.
라이브러리
1
2
3
importpandasaspdimportrandomimporttime
실험 데이터셋
df_a : user_id, some_data 두 컬럼으로 이루어져 있다.
df_a의 some_data 는 약 20% 가량이 NaN 값을 가진다.
df_b : user_id, alt_data 두 컬럼으로 이루어져 있다.
df_a와 df_b의 user_id 집합은 동일하다.
df_b 의 alt_data 에는 결측치가 없다.
1
2
3
4
5
6
7
8
9
10
qnt=10000# 데이터 수
df_a_origin=pd.DataFrame({"user_id":[str(x)forxinrange(1,qnt+1)],"some_data":[random.randint(0,qnt)ifrandom.randint(0,qnt)<qnt*4/5elseNonefor_inrange(qnt)]})df_b=pd.DataFrame({"user_id":[str(x)forxinrange(1,qnt+1)],"alt_data":[random.randint(0,qnt)for_inrange(qnt)]})
실험의 목표
df_a 의 NaN 인 some_data 값을 찾아, df_b 의 동일 user_id 의 alt_data 로 대체한다.
대조군
작동 방식 : df_a 의 각 row 를 순회하며 NaN값 여부를 확인하고, alt_data로 대체한다.
순서
작동
시간복잡도
1
df_a의 각 row를 순회하며, some_data가 NaN인지 확인한다.
O(N_a)
2
NaN값인 경우, df_b에서 동일한 user_id 에 해당하는 alt_data를 찾는다.
O(N_b)
3
row의 some_data 를 찾은 alt_data로 대체한다.
O(1)
전체 시간복잡도 : O(N_a * N_b)
또한 매 반복마다 boolean mask 를 생성하므로 메모리 비용이 발생
Comments