"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > تحسين كود Python باستخدام وحدة cProfile وPyPy: دليل كامل

تحسين كود Python باستخدام وحدة cProfile وPyPy: دليل كامل

تم النشر بتاريخ 2024-11-07
تصفح:645

Optimizing Python Code Using cProfile and PyPy module: A Complete Guide

مقدمة

كمطورين لـ Python، غالبًا ما نركز على تشغيل التعليمات البرمجية الخاصة بنا قبل أن نقلق بشأن تحسينها. ومع ذلك، عند التعامل مع التطبيقات واسعة النطاق أو التعليمات البرمجية ذات الأداء الحرج، يصبح التحسين أمرًا بالغ الأهمية. في هذا المنشور، سنغطي أداتين قويتين يمكنك استخدامهما لتحسين كود Python الخاص بك: وحدة cProfile ومترجم PyPy.

بنهاية هذه التدوينة ستتعلم:

  1. كيفية تحديد اختناقات الأداء باستخدام وحدة cProfile.
  2. كيفية تحسين الكود الخاص بك من أجل السرعة.
  3. كيفية استخدام PyPy لزيادة تسريع برامج Python الخاصة بك من خلال التجميع في الوقت المناسب (JIT).

لماذا يهم تحسين الأداء

تشتهر لغة بايثون بسهولة الاستخدام وسهولة القراءة والنظام البيئي الواسع للمكتبات. ولكنها أيضًا أبطأ من بعض اللغات الأخرى مثل C أو Java نظرًا لطبيعتها المترجمة. لذلك، فإن معرفة كيفية تحسين كود Python الخاص بك يمكن أن يكون أمرًا بالغ الأهمية في التطبيقات الحساسة للأداء، مثل نماذج التعلم الآلي، أو أنظمة الوقت الفعلي، أو أنظمة التداول عالية التردد.

يتبع التحسين عادة الخطوات التالية:

  1. قم بتعريف الكود الخاص بك لفهم مكان الاختناقات.
  2. تحسين الكود في المناطق غير الفعالة.
  3. قم بتشغيل الكود المحسن في مترجم أسرع، مثل PyPy، لتحقيق أقصى قدر من الأداء.

الآن، لنبدأ بتنميط الكود الخاص بك.

الخطوة 1: تحديد مواصفات الكود الخاص بك باستخدام cProfile

ما هو الملف الشخصي؟

cProfile عبارة عن وحدة Python مدمجة لتوصيف الأداء. فهو يتتبع مقدار الوقت الذي تستغرقه كل وظيفة في التعليمات البرمجية الخاصة بك للتنفيذ، مما يمكن أن يساعدك في تحديد الوظائف أو أقسام التعليمات البرمجية التي تسبب التباطؤ.

استخدام cProfile من سطر الأوامر

إن أبسط طريقة لتعريف البرنامج النصي هي تشغيل cProfile من سطر الأوامر. على سبيل المثال، لنفترض أن لديك برنامجًا نصيًا يسمى my_script.py:

python -m cProfile -s cumulative my_script.py

توضيح:

  • -m cProfile: تشغيل وحدة cProfile كجزء من مكتبة Python القياسية.
  • -s التراكمي: فرز نتائج التوصيف حسب الوقت التراكمي الذي يقضيه في كل وظيفة.
  • my_script.py: برنامج بايثون النصي الخاص بك.

سيؤدي هذا إلى إنشاء تحليل تفصيلي للمكان الذي يقضي فيه الكود الخاص بك وقته.

مثال: إنشاء ملف تعريف لبرنامج Python النصي

دعونا نلقي نظرة على برنامج بايثون الأساسي الذي يحسب أرقام فيبوناتشي بشكل متكرر:

def fibonacci(n):
    if n 



تشغيل هذا البرنامج النصي باستخدام cProfile:

python -m cProfile -s cumulative fibonacci_script.py

فهم إخراج cProfile

بمجرد تشغيل cProfile، سترى شيئًا مثل هذا:

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     8320    0.050    0.000    0.124    0.000 fibonacci_script.py:3(fibonacci)

يوفر كل عمود بيانات الأداء الرئيسية:

  • ncalls: عدد مرات استدعاء الوظيفة.
  • الوقت الكامل: إجمالي الوقت المستغرق في الوظيفة (باستثناء الوظائف الفرعية).
  • وقت نائب الرئيس: الوقت التراكمي المستغرق في الوظيفة (بما في ذلك الوظائف الفرعية).
  • المكالمة الواحدة: الوقت لكل مكالمة.

إذا كانت دالة فيبوناتشي تستغرق وقتًا طويلاً، فسوف يوضح لك هذا الإخراج أين يجب تركيز جهود التحسين الخاصة بك.

تحديد ملامح أجزاء محددة من التعليمات البرمجية الخاصة بك

يمكنك أيضًا استخدام cProfile برمجيًا ضمن التعليمات البرمجية الخاصة بك إذا كنت تريد فقط إنشاء ملف تعريف لأقسام محددة.

import cProfile

def fibonacci(n):
    if n 



الخطوة 2: تحسين كود بايثون الخاص بك

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

تقنيات تحسين بايثون الشائعة

  1. استخدام الوظائف المضمنة: تم تحسين الوظائف المضمنة مثل sum() وmin() وmax() بشكل كبير في Python وعادة ما تكون أسرع من الحلقات المنفذة يدويًا.

مثال:

   # Before: Custom sum loop
   total = 0
   for i in range(1000000):
       total  = i

   # After: Using built-in sum
   total = sum(range(1000000))
  1. تجنب استدعاءات الوظائف غير الضرورية: استدعاءات الوظائف لها حمل، خاصة الحلقات الداخلية. حاول تقليل المكالمات الزائدة.

مثال:

   # Before: Unnecessary repeated calculations
   for i in range(1000):
       print(len(my_list))  # len() is called 1000 times

   # After: Compute once and reuse
   list_len = len(my_list)
   for i in range(1000):
       print(list_len)
  1. الحفظ: بالنسبة للوظائف العودية، يمكنك استخدام الحفظ لتخزين نتائج العمليات الحسابية باهظة الثمن لتجنب العمل المتكرر.

مثال:

   from functools import lru_cache

   @lru_cache(maxsize=None)
   def fibonacci(n):
       if n 



يؤدي هذا إلى تسريع عملية حسابية فيبوناتشي بشكل كبير عن طريق تخزين نتائج كل استدعاء متكرر.

الخطوة 3: استخدام PyPy للتجميع في الوقت المناسب

ما هو بيبى؟

PyPy هو مترجم Python بديل يستخدم تجميع Just-in-Time (JIT) لتسريع كود Python الخاص بك. يقوم PyPy بتجميع مسارات التعليمات البرمجية التي يتم تنفيذها بشكل متكرر في كود الجهاز، مما يجعله أسرع بكثير من مترجم CPython القياسي لمهام معينة.

تثبيت باي باي

يمكنك تثبيت PyPy باستخدام مدير الحزم مثل apt على Linux أو Brew على macOS:

# On Ubuntu
sudo apt-get install pypy3

# On macOS (using Homebrew)
brew install pypy3

تشغيل كود بايثون مع PyPy

بمجرد تثبيت PyPy، يمكنك تشغيل البرنامج النصي الخاص بك به بدلاً من CPython:

pypy3 my_script.py

لماذا استخدام PyPy؟

  • يعد PyPy مثاليًا لـ المهام المرتبطة بوحدة المعالجة المركزية حيث يقضي البرنامج معظم وقته في الحساب (على سبيل المثال، الحلقات، والوظائف العودية، ومعالجة الأرقام).
  • يعمل برنامج التحويل البرمجي JIT الخاص بـ PyPy على تحسين مسارات التعليمات البرمجية التي يتم تنفيذها بشكل متكرر، مما قد يؤدي إلى عمليات تسريع كبيرة دون أي تغييرات في التعليمات البرمجية.

الخطوة 4: الجمع بين cProfile وPyPy لتحقيق أقصى قدر من التحسين

الآن، دعونا ندمج هذه الأدوات لتحسين كود بايثون الخاص بك بشكل كامل.

مثال لسير العمل

  1. قم بتعريف الكود الخاص بك باستخدام cProfile لتحديد الاختناقات.
  2. تحسين التعليمات البرمجية الخاصة بك باستخدام التقنيات التي ناقشناها (الإضافات، والحفظ، وتجنب استدعاءات الوظائف غير الضرورية).
  3. قم بتشغيل الكود المحسن الخاص بك مع PyPy لتحقيق تحسينات إضافية في الأداء.

دعونا نعيد النظر في مثال فيبوناتشي الخاص بنا ونجمع كل شيء معًا.

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n 



بعد تحسين الكود من خلال الحفظ، قم بتشغيله باستخدام PyPy لمزيد من تحسينات الأداء:

pypy3 fibonacci_script.py

خاتمة

من خلال الاستفادة من cProfile وPyPy، يمكنك تحسين كود Python الخاص بك بشكل كبير. استخدم cProfile لتحديد ومعالجة اختناقات الأداء في التعليمات البرمجية الخاصة بك. ثم استخدم PyPy لزيادة سرعة تنفيذ برنامجك من خلال تجميع JIT.

في ملخص:

  1. قم بتعريف الكود الخاص بك باستخدام cProfile لفهم اختناقات الأداء.
  2. تطبيق تقنيات تحسين لغة Python، مثل استخدام العناصر المضمنة والحفظ.
  3. قم بتشغيل الكود المحسن على PyPy لتحقيق أداء أفضل.

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

تواصل معي:
جيثب
لينكد إن

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/usooldatascience/optimizing-python-code-using-cprofile-and-pypy-module-a-complete-guide-4779?1 إذا كان هناك أي انتهاك، فيرجى الاتصال بـ Study_golang @163.com حذف
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3