تقنية وتكنولوجيا

تحسين كود الباندا: تأثير تسلسل العمليات | بواسطة مارسين كوزاك


برمجة بايثون

تعرف على كيفية إعادة ترتيب التعليمات البرمجية الخاصة بك لتحقيق تحسينات كبيرة في السرعة.

نحو علم البيانات
تصوير نيك فيوينغز على Unsplash

تقدم Pandas إطارًا رائعًا للعمل على إطارات البيانات. في علم البيانات، نعمل مع إطارات بيانات صغيرة وكبيرة وأحيانًا كبيرة جدًا. في حين أن تحليل العمليات الصغيرة يمكن أن يكون سريعًا للغاية، إلا أن عملية واحدة على إطار بيانات كبير يمكن أن تستغرق وقتًا ملحوظًا.

سأوضح في هذه المقالة أنه في كثير من الأحيان يمكنك جعل هذا الوقت أقصر من خلال شيء لا يكلف شيئًا عمليًا: ترتيب العمليات على إطار البيانات.

تخيل إطار البيانات التالي:

import pandas as pd

n = 1_000_000
df = pd.DataFrame({
letter: list(range(n))
for letter in "abcdefghijklmnopqrstuwxyz"
})

مع مليون صف و25 عمودًا، إنها كبيرة. ستكون العديد من العمليات على إطار البيانات هذا ملحوظة على أجهزة الكمبيوتر الشخصية الحالية.

تخيل أننا نريد تصفية الصفوف، وذلك لأخذ تلك التي تتبع الشرط التالي: a < 50_000 and b > 3000 وحدد خمسة أعمدة: take_cols=['a', 'b', 'g', 'n', 'x']. يمكننا القيام بذلك بالطريقة التالية:

subdf = df[take_cols]
subdf = subdf[subdf['a'] < 50_000]
subdf = subdf[subdf['b'] > 3000]

في هذا الكود، نأخذ الأعمدة المطلوبة أولاً، ثم نقوم بتصفية الصفوف. يمكننا تحقيق نفس الشيء بترتيب مختلف للعمليات، وذلك بإجراء التصفية أولاً ثم تحديد الأعمدة:

subdf = df[df['a'] < 50_000]
subdf = subdf[subdf['b'] > 3000]
subdf = subdf[take_cols]

يمكننا تحقيق نفس النتيجة من خلال تسلسل عمليات الباندا. أنابيب الأوامر المقابلة هي كما يلي:

# first take columns then filter rows
df.filter(take_cols).query(query)

# first filter rows then take columns
df.query(query).filter(take_cols)

منذ df كبيرة، فمن المحتمل أن تختلف الإصدارات الأربعة في الأداء. أيهما سيكون الأسرع وأيهما سيكون الأبطأ؟

دعونا نقيس هذه العمليات. سوف نستخدم timeit وحدة:

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى