본문 바로가기
SQL, Database

Polars

by yj-data 2025. 8. 20.

pandas vs polars

기능 Pandas Polars
속도 단일 코어 실행 (느림) 멀티코어 지원 (빠름)
메모리 사용 메모리 내에서만 처리 가능 Lazy Execution 지원
API 스타일 즉시 실행 즉시 실행 + 지연 실행 가능
대용량 데이터 비효율적 최적화됨

 

  • Polars는 Pandas보다 빠르고, 더 적은 메모리를 사용하며, 멀티코어 활용이 뛰어난 고성능 데이터 프레임 라이브러리
  • Rust로 구현
  • polars는 전체 코드를 쭉 보고 효율적인 방향으로 알아서 실행해줌. pandas는 작성 순서대로 연산.
!pip install polars

import pandas as pd
import polars as pl
import numpy as np

#데이터생성
rows = int(1E7) # 1000*10000
data = {
    'id': np.arange(rows),
    'category': np.random.choice(list('ABCD'),rows),  #['a'...] 보다 list('abcd') 이렇게 씀
    'value': np.random.rand(rows)*100,  #random.rand 는 균등분포가 생성됨
    'count' : np.random.randint(1,100,rows), #1부터 99까지 수 랜덤
}
df = pd.DataFrame(data)
df.tail(2)
df.dtypes

pd_df = pd.DataFrame(data)
pd_df.tail(2)

pl_df = pl.DataFrame(data)
pl_df.tail(2)

#기본연산  #여섯배 빠름
%%timeit
pd_mean = pd_df['value'].mean()
pd_sum = pd_df['count'].sum()
#36.8 ms ± 472 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
pl_mean = pl_df['value'].mean()
pl_sum = pl_df['count'].sum()
#6.81 ms ± 48.5 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# 3. 데이터 필터링 #1.5배 빠름
%%timeit
pd_filter = pd_df[pd_df['value'] > 50]
#143 ms ± 5.58 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
pl_filter = pl_df.filter(pl_df['value'] > 50)
#89.2 ms ± 27.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

# 4. 데이터 그룹핑  #polars가 다섯배 빠름(특히나 그루핑은 폴라스가 멀티코어를 사용하기 때문에 훨씬 빠름)
%%timeit
pdgb = pd_df.groupby('category')['value'].mean()
#432 ms ± 5.67 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
plgb = pl_df.group_by('category').agg(pl.col('value').mean())
#80.2 ms ± 7.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)