Hub documentation
Optimasi
Optimasi
Kami sebelumnya membahas secara singkat perbedaan antara evaluasi lazy dan eager. Pada halaman ini, kami akan menunjukkan bagaimana API lazy dapat digunakan untuk mendapatkan keuntungan performa yang sangat besar.
Lazy vs Eager
Polars mendukung dua mode operasi: lazy dan eager. Pada API eager, kueri dieksekusi segera, sedangkan pada API lazy, kueri hanya dievaluasi ketika 'dibutuhkan'. Menunda eksekusi hingga saat terakhir dapat memberikan keunggulan kinerja yang signifikan, dan itulah mengapa API lazy lebih disukai dalam sebagian besar kasus non-interaktif.
Contoh
Kami akan menggunakan contoh dari halaman sebelumnya untuk menunjukkan manfaat performa dari penggunaan API lazy. Kode di bawah ini akan menghitung jumlah unggahan dari 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)Lazy
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()Waktu
Menjalankan kedua kueri menghasilkan waktu eksekusi berikut pada laptop biasa dengan koneksi internet rumah:
- Eager:
1.96detik - Lazy:
410milidetik
Query lazy sekitar 5 kali lebih cepat daripada query eager. Alasannya adalah query optimizer: jika kita menunda collect-ing dataset kita hingga akhir, Polars akan dapat menentukan kolom dan baris mana yang diperlukan serta menerapkan filter sedini mungkin saat membaca data. Untuk format file seperti Parquet yang berisi metadata (misalnya min, max dalam sekelompok baris tertentu), perbedaannya bahkan bisa lebih besar karena Polars dapat melewati seluruh grup baris berdasarkan filter dan metadata tanpa mengirimkan data melalui jaringan.