تحسين كود الباندا: تأثير تسلسل العمليات | بواسطة مارسين كوزاك
النشرة الإخبارية
Sed ut perspiciatis unde.
برمجة بايثون
تعرف على كيفية إعادة ترتيب التعليمات البرمجية الخاصة بك لتحقيق تحسينات كبيرة في السرعة.
تقدم Pandas إطارًا رائعًا للعمل على إطارات البيانات. في علم البيانات، نعمل مع إطارات بيانات صغيرة وكبيرة وأحيانًا كبيرة جدًا. في حين أن تحليل العمليات الصغيرة يمكن أن يكون سريعًا للغاية، إلا أن عملية واحدة على إطار بيانات كبير يمكن أن تستغرق وقتًا ملحوظًا.
سأوضح في هذه المقالة أنه في كثير من الأحيان يمكنك جعل هذا الوقت أقصر من خلال شيء لا يكلف شيئًا عمليًا: ترتيب العمليات على إطار البيانات.
تخيل إطار البيانات التالي:
import pandas as pdn = 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
وحدة:
اكتشاف المزيد من موقع علم
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.