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

تقنيات تحسين برمجة بايثون.

تم النشر بتاريخ 2024-08-25
تصفح:391

Python programming optimisation techniques.

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

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

علاوة على ذلك، غالبًا ما تكون التعليمات البرمجية المُحسّنة أكثر سهولة في الصيانة والتوسيع. من خلال الالتزام بأفضل ممارسات التحسين، يمكن للمطورين التأكد من أن قاعدة التعليمات البرمجية الخاصة بهم تظل نظيفة ونموذجية، مما يسهل تحديث التطبيق أو توسيع نطاقه حسب الحاجة. ويصبح هذا الأمر ذا أهمية متزايدة مع تزايد تعقيد مشاريع البرمجيات ومع زيادة الطلب على النظام.

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

1. التعبئة المتغيرة

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

مثال:

import struct

# Packing two integers into a binary format
packed_data = struct.pack('ii', 10, 20)

# Unpacking the packed binary data
a, b = struct.unpack('ii', packed_data)

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

2. التخزين مقابل الذاكرة

يعد فهم الفرق بين التخزين (القرص) والذاكرة (RAM) أمرًا بالغ الأهمية. تكون عمليات الذاكرة أسرع ولكنها متقلبة، بينما يكون التخزين ثابتًا ولكنه أبطأ. في التطبيقات ذات الأداء الحرج، يعد الاحتفاظ بالبيانات التي يتم الوصول إليها بشكل متكرر في الذاكرة وتقليل عمليات الإدخال/الإخراج للتخزين أمرًا ضروريًا للسرعة.

مثال:

import mmap

# Memory-mapping a file
with open("data.txt", "r b") as f:
    mmapped_file = mmap.mmap(f.fileno(), 0)
    print(mmapped_file.readline())
    mmapped_file.close()

تسمح لك الملفات المعينة للذاكرة بالتعامل مع تخزين القرص كما لو كان ذاكرة، مما يؤدي إلى تسريع أوقات الوصول للملفات الكبيرة.

3. متغيرات الطول الثابت مقابل متغيرات الطول المتغير

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

مثال:

import array

# Using fixed-length array for performance
fixed_array = array.array('i', [1, 2, 3, 4, 5])

# Dynamic list (variable-length)
dynamic_list = [1, 2, 3, 4, 5]

هنا، array.array توفر مصفوفة ذات طول ثابت، مما يوفر أداء أكثر قابلية للتنبؤ به من القوائم الديناميكية.

4. الوظائف الداخلية مقابل الوظائف العامة

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

مثال:

def _private_function(data):
    # Optimized for internal use, with minimal error handling
    return data ** 2

def public_function(data):
    # Includes additional checks for external use
    if isinstance(data, int):
        return _private_function(data)
    raise ValueError("Input must be an integer")

من خلال الاحتفاظ بالحسابات الثقيلة في وظيفة خاصة، يمكنك تحسين كفاءة الكود، مع الاحتفاظ بالوظائف العامة للسلامة الخارجية وسهولة الاستخدام.

5. معدلات الوظائف

في بايثون، تعمل أدوات الديكور كمعدلات للوظائف، مما يسمح لك بإضافة وظائف قبل أو بعد التنفيذ الرئيسي للوظيفة. يعد هذا مفيدًا لمهام مثل التخزين المؤقت أو التحكم في الوصول أو التسجيل، والتي يمكنها تحسين استخدام الموارد عبر استدعاءات الوظائف المتعددة.

مثال:

from functools import lru_cache

@lru_cache(maxsize=100)
def compute_heavy_function(x):
    # A computationally expensive operation
    return x ** x

يؤدي استخدام lru_cache كمصمم ديكور إلى تخزين نتائج استدعاءات الوظائف باهظة الثمن مؤقتًا، مما يؤدي إلى تحسين الأداء عن طريق تجنب العمليات الحسابية المتكررة.

6. استخدام المكتبات

تتيح لك الاستفادة من المكتبات تجنب إعادة اختراع العجلة. المكتبات مثل NumPy مكتوبة بلغة C ومصممة للأداء، مما يجعلها أكثر كفاءة للحسابات الرقمية الثقيلة مقارنة بتطبيقات Python النقية.

مثال:

import numpy as np

# Efficient matrix multiplication using NumPy
matrix_a = np.random.rand(1000, 1000)
matrix_b = np.random.rand(1000, 1000)
result = np.dot(matrix_a, matrix_b)

هنا، تم تحسين وظيفة النقطة في NumPy لعمليات المصفوفة، متفوقة بكثير على الحلقات المتداخلة في لغة بايثون النقية.

7. الشروط الشرطية ذات الدائرة القصيرة

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

مثال:

def complex_condition(x, y):
    return x != 0 and y / x > 2  # Stops evaluation if x is 0

في هذا المثال، تضمن عوامل التشغيل المنطقية في Python أن يتم تنفيذ القسمة فقط إذا كانت x غير صفر، مما يمنع أخطاء وقت التشغيل المحتملة والحسابات غير الضرورية.

8. تحرير الذاكرة

في التطبيقات طويلة الأمد، خاصة تلك التي تتعامل مع مجموعات البيانات الكبيرة، من الضروري تحرير الذاكرة بمجرد عدم الحاجة إليها. يمكن القيام بذلك باستخدام del، gc.collect()، أو عن طريق السماح للكائنات بالخروج عن النطاق.

مثال:

import gc

# Manual garbage collection to free up memory
large_data = [i for i in range(1000000)]
del large_data
gc.collect()  # Forces garbage collection

يضمن استخدام gc.collect() استعادة الذاكرة على الفور، وهو أمر بالغ الأهمية في البيئات ذات الذاكرة المحدودة.

9. رسائل الخطأ القصيرة

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

مثال:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Err: Div/0")  # Short, concise error message

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

10. تحسين الحلقات

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

مثال:

import numpy as np

# Vectorised operation with NumPy
array = np.array([1, 2, 3, 4, 5])

# Instead of looping through elements
result = array * 2  # Efficient, vectorised operation

يلغي التوجيه الاتجاهي الحاجة إلى حلقات صريحة، مع الاستفادة من التحسينات ذات المستوى المنخفض لتنفيذ أسرع.


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

ملاحظة: يمكنك استخدام https://perfpy.com/#/ للتحقق من كفاءة كود بايثون.

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/jamesbright/10-python-programming-optimisation-techniques-5ckf?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3