Hub documentation
Optimizasyonlar
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.96saniye - Gecikmeli:
410milisaniye
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.