تحليل أداء كود Python: دليل شامل للتحسين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

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

أساسيات تحليل أداء كود Python

تحليل الأداء هو فحص ديناميكي للبرنامج يقيس:

  • وقت تنفيذ الدوال الفردية
  • عدد مرات استدعاء الدوال
  • استهلاك الذاكرة العشوائية (RAM)
  • الحمل على المعالج (CPU)

الهدف الرئيسي من تحليل الأداء هو تحديد أجزاء الكود الحرجة التي تبطئ التطبيق وتتطلب تحسينًا.

متى تحتاج إلى تحليل الأداء

تحليل الأداء يصبح ضروريًا في الحالات التالية:

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

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

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

تحسين الخوارزميات: عند العمل مع كميات كبيرة من البيانات أو الحسابات المعقدة، يكشف تحليل الأداء عن الخوارزميات غير الفعالة.

أدوات التحليل المضمنة

وحدة cProfile

cProfile هو أداة تحليل أداء قياسية في Python، مدمجة في المفسر. وهي مناسبة للتحليل العام لأداء البرنامج.

import cProfile

def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

def test_function():
    result = fibonacci(30)
    return result

# تشغيل تحليل الأداء
cProfile.run('test_function()')

نتيجة تحليل الأداء تحتوي على مقاييس مهمة:

  • ncalls — إجمالي عدد مرات استدعاء الدالة
  • tottime — وقت تنفيذ الدالة دون احتساب الاستدعاءات المتداخلة
  • percall — متوسط الوقت لكل استدعاء
  • cumtime — الوقت الإجمالي بما في ذلك جميع الاستدعاءات المتداخلة
  • filename:lineno(function) — موقع الدالة في الكود

وحدة timeit للقياسات الدقيقة

لقياس وقت تنفيذ أجزاء صغيرة من الكود، استخدم وحدة timeit:

import timeit

# مقارنة طرق مختلفة لإنشاء قائمة
list_comprehension = timeit.timeit('[i*2 for i in range(1000)]', number=1000)
map_function = timeit.timeit('list(map(lambda x: x*2, range(1000)))', number=1000)

print(f"List comprehension: {list_comprehension:.6f} ثانية")
print(f"Map function: {map_function:.6f} ثانية")

وحدة profile للتحليل التفصيلي

أداة تحليل أداء بديلة مدمجة، تعمل بشكل أبطأ من cProfile ولكنها توفر معلومات أكثر تفصيلاً:

import profile

def complex_calculation():
    data = []
    for i in range(10000):
        data.append(i ** 2)
    return sum(data)

profile.run('complex_calculation()')

أدوات تحليل خارجية

line_profiler — تحليل سطر بسطر

هذه الأداة تظهر وقت تنفيذ كل سطر من الكود:

pip install line_profiler
@profile
def process_data():
    data = []
    for i in range(100000):  # هذا السطر قد يكون نقطة اختناق
        data.append(i * 2)
    return sum(data)

تشغيل التحليل سطرًا بسطر:

kernprof -l -v script.py

المدونات

توصيات الكتب