Hub documentation

최적화

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

최적화

이전에서 지연 평가와 즉시 평가의 차이를 간략히 살펴보았습니다. 이 페이지에서는 지연 API를 활용하여 상당한 성능 향상을 얻을 수 있는 방법을 보여 드리겠습니다.

Lazy와 Eager

Polars는 lazy와 eager라는 두 가지 운영 모드를 지원합니다. eager API에서는 쿼리가 즉시 실행되는 반면, lazy API에서는 쿼리가 실제로 ‘필요할 때’에만 평가됩니다. 실행을 마지막 순간까지 지연시키는 것은 상당한 성능 이점을 가져올 수 있으며, 이것이 대부분의 비대화형(non-interactive) 상황에서 lazy API가 선호되는 이유입니다.

예시

이전 페이지의 예제를 사용하여 lazy API를 사용할 때의 성능 이점을 보여 드리겠습니다. 아래 코드는 archive.org의 업로드 수를 계산합니다.

Eager

import polars as pl
import datetime

df = pl.read_csv("hf://datasets/commoncrawl/statistics/tlds.csv", try_parse_dates=True)

df = df.select("suffix", "crawl", "date", "tld", "pages", "domains")
df = df.filter(
    (pl.col("date") >= datetime.date(2020, 1, 1)) |
    pl.col("crawl").str.contains("CC")
)
df = df.with_columns(
    (pl.col("pages") / pl.col("domains")).alias("pages_per_domain")
)
df = df.group_by("tld", "date").agg(
    pl.col("pages").sum(),
    pl.col("domains").sum(),
)
df = df.group_by("tld").agg(
    pl.col("date").unique().count().alias("number_of_scrapes"),
    pl.col("domains").mean().alias("avg_number_of_domains"),
    pl.col("pages").sort_by("date").pct_change().mean().alias("avg_page_growth_rate"),
).sort("avg_number_of_domains", descending=True).head(10)

지연

import polars as pl
import datetime

lf = (
    pl.scan_csv("hf://datasets/commoncrawl/statistics/tlds.csv", try_parse_dates=True)
    .filter(
        (pl.col("date") >= datetime.date(2020, 1, 1)) |
        pl.col("crawl").str.contains("CC")
    ).with_columns(
        (pl.col("pages") / pl.col("domains")).alias("pages_per_domain")
    ).group_by("tld", "date").agg(
        pl.col("pages").sum(),
        pl.col("domains").sum(),
    ).group_by("tld").agg(
        pl.col("date").unique().count().alias("number_of_scrapes"),
        pl.col("domains").mean().alias("avg_number_of_domains"),
        pl.col("pages").sort_by("date").pct_change().mean().alias("avg_page_growth_rate"),
    ).sort("avg_number_of_domains", descending=True).head(10)
)
df = lf.collect()

타이밍

…

  • Eager: 1.96초
  • Lazy: 410 밀리초

Lazy query는 eager query보다 약 5배 빠릅니다. 그 이유는 쿼리 옵티마이저에 있습니다. 데이터셋의 collect를 마지막까지 지연시키면, Polars는 어떤 열과 행이 필요한지 추론하고 데이터를 읽을 때 가능한 한 조기에 필터를 적용할 수 있습니다. Parquet와 같이 메타데이터(예: 특정 행 그룹의 min, max)를 포함하는 파일 포맷의 경우, Polars가 필터와 메타데이터를 기반으로 데이터 전송 없이 전체 행 그룹을 건너뛸 수 있으므로 차이가 더 클 수 있습니다.

Update on GitHub