Hub documentation

التحسينات

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

التحسينات

لمسنا بإيجاز الفرق بين التقييم الكسول (lazy) والتقييم الجاد (eager). في هذه الصفحة، سنوضح كيف يمكن استخدام واجهة برمجة التطبيقات الكسولة (lazy API) للحصول على مكاسب أداء هائلة.

التحميل الكسول مقابل التحميل الفوري

يدعم Polars وضعين للتشغيل: وضع كسول (lazy) ووضع فوري (eager). في واجهة برمجة التطبيقات الفورية، يتم تنفيذ الاستعلام فورًا، بينما في واجهة برمجة التطبيقات الكسولة، لا يتم تقييم الاستعلام إلا عندما يكون 'مطلوبًا'. يمكن أن يؤدي تأجيل التنفيذ حتى اللحظة الأخيرة إلى مزايا أداء كبيرة، ولهذا تُفضَّل واجهة برمجة التطبيقات الكسولة في معظم الحالات غير التفاعلية.

مثال

سنستخدم المثال من الصفحة السابقة لإظهار الفوائد الأدائية لاستخدام واجهة برمجة التطبيقات الكسولة (lazy 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-ing مجموعة البيانات الخاصة بنا حتى النهاية، فسيتمكن Polars من الاستدلال على الأعمدة والصفوف المطلوبة وتطبيق عوامل التصفية في أبكر وقت ممكن عند قراءة البيانات. وفيما يتعلق بتنسيقات الملفات مثل Parquet التي تحتوي على بيانات وصفية (مثل الحد الأدنى والحد الأقصى في مجموعة معينة من الصفوف)، يمكن أن يكون الفرق أكبر حتى، إذ يستطيع Polars تخطي مجموعات الصفوف بأكملها بناءً على عوامل التصفية والبيانات الوصفية دون إرسال البيانات عبر الشبكة.

Update on GitHub