Hub documentation

Optimasi

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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.96 detik
  • Lazy: 410 milidetik

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.

Update on GitHub