Hub documentation
التحسينات
التحسينات
لمسنا بإيجاز الفرق بين التقييم الكسول (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 تخطي مجموعات الصفوف بأكملها بناءً على عوامل التصفية والبيانات الوصفية دون إرسال البيانات عبر الشبكة.