Hub documentation

Optimizasyonlar

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Optimizasyonlar

Tembel ve açgözlü değerlendirme arasındaki farka kısaca değindik. Bu sayfada, tembel API'nin devasa performans avantajları elde etmek için nasıl kullanılabileceğini göstereceğiz.

Lazy ve Eager

Polars, iki çalışma modunu destekler: lazy (tembel) ve eager (hırslı). Eager API'de sorgu derhal çalıştırılırken, lazy API'de sorgu yalnızca 'gerekli' olduğunda değerlendirilir. Çalıştırmanın son ana kadar ertelenmesi önemli performans avantajları sağlayabilir ve bu nedenle çoğu etkileşimsiz durumda lazy API tercih edilir.

Örnek

Önceki sayfadaki örneği kullanarak tembel API'nin kullanımının performans avantajlarını göstereceğiz. Aşağıdaki kod, archive.org üzerinden yapılan yükleme sayısını hesaplar.

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)

Gecikmeli

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()

Zamanlamalar

Her iki sorgunun çalıştırılması, ev tipi internet bağlantısına sahip sıradan bir dizüstü bilgisayarda aşağıdaki çalışma sürelerine yol açar:

  • Eager: 1.96 saniye
  • Gecikmeli: 410 milisaniye

Gecikmeli sorgu, derhal çalışan sorgudan ~5 kat daha hızlıdır. Bunun nedeni sorgu optimizatörüdür: veri setimizi collect etmeyi sona kadar ertelersek, Polars hangi sütunların ve satırların gerekli olduğunu çıkarım yapabilir ve verileri okurken filtreleri mümkün olan en erken aşamada uygulayabilir. Parquet gibi metadata içeren (ör. belirli bir satır grubundaki min, max) dosya biçimleri için fark daha da büyük olabilir; çünkü Polars, verileri ağ üzerinden göndermeden, filtreler ve metadata temelinde tüm satır gruplarını atlayabilir.

Update on GitHub