Hub 文件

最佳化

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

最佳化

我們簡要介紹了惰性求值和立即求值之間的區別。在本頁中,我們將展示如何使用惰性 API 來獲得巨大的效能優勢。

惰性與立即

Polars 支援兩種操作模式:惰性求值和立即求值。在立即求值 API 中,查詢會立即執行;而在惰性求值 API 中,查詢只有在“需要”時才會被求值。將執行推遲到最後一刻可以顯著提高效能,這就是為什麼在大多數非互動式情況下首選惰性求值 API 的原因。

示例

我們將使用前一頁的示例來展示使用惰性 API 的效能優勢。以下程式碼將計算來自 archive.org 的上傳數量。

立即求值

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

計時

在配備家用網際網路連線的普通筆記型電腦上執行這兩個查詢,可得到以下執行時間:

  • 立即求值:1.96
  • 惰性求值:410 毫秒

惰性查詢比立即查詢快約 5 倍。原因是查詢最佳化器:如果我們將資料集的 `collect` 操作推遲到最後,Polars 將能夠判斷需要哪些列和行,並在讀取資料時儘早應用過濾器。對於包含元資料(例如,某一行組中的最小值、最大值)的 Parquet 等檔案格式,差異甚至更大,因為 Polars 可以根據過濾器和元資料跳過整個行組,而無需透過網路傳輸資料。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.