كيفية جعل Python أسرع باستخدام Cython؟
في هذا البرنامج التعليمي ، سنناقش كيفية جعل Python يعمل بشكل أسرع باستخدام Cython. أولاً ، سنأخذ الفكرة العامة لـ Cython أي ، كيف تعمل؟ كيفية تثبيت سايثون؟ علاوة على ذلك ، سنلقي نظرة عبر المثال على كيفية الاستفادة من ذلك من خلال تعديلات بسيطة في التعليمات البرمجية. دعونا نبدأ الغوص العميق في التفاصيل.
لماذا نحتاج سيثون؟
سيثون أساسا بمثابة وسيط بين بايثون و C / C ++. لماذا نحتاج إلى جعل بايثون أسرع ، حيث تعتبر واحدة من اللغات المتقدمة؟ نحن نفضل أيضًا استخدام بايثون نظرًا لبساطتها في كتابة التعليمات البرمجية ، ولكنها مازالت متأخرة في الحسابات. هذا هو السبب الأساسي وراء استخدام نظام Cython في Python.
كيفية تثبيت سايثون؟
لديك لتشغيل أمر بسيط على موجه الأوامر. واحدة من أبسط الطرق لتثبيت سايثون هي من خلال النقطة:
>> Pip install Cython
ما هو سايثون؟
يسمح لنا سايثون بإضافة الكتابة ، أي لإضافة نوع البيانات إلى سمات الفئة المتغيرة والمرجعية التي ستقوم بعد ذلك بإنشاء ملف مصدر C لملف Cython بالإضافة إلى ملحق c لـ Python. دعونا نشير إلى الرسم البياني أدناه من أجل الحصول على فكرة عن كيفية عمل سيثون.
المثال
للحفاظ على هذه المدونة بسيطة ، سأقوم بأخذ مثال بسيط لإظهار الفرق بين بيثون وسيثون.
حساب مجموع حتى no. في قائمة
Calculating the sum of even no.s in a list
في هذا المثال ، سيحسب مبلغ مجموع النقاط. في هذا الكود ، نحتاج إلى استخدام للحلقة وفي الجلسة القادمة ، سوف نرى كيف يقوم Cython بتشغيل حلقة التشغيل بكفاءة.
كود Python بسيط (test_py.py)
لنفترض أن اسم الملف هو test_py.py. هنا نحن نكتب رمز بيثون بسيط فقط.
1. def sum_even_no(x):
2. y = 0
3. for i in range(x):
4. if i%2 == 0:
5. y += i
6. return y
الآن ، سوف يكتب كود Cython لنفس المنطق أعلاه. يجب حفظ ملف cython كامتداد .pyx
1. def sum_even_no(x):
2. cdef int y = 0
3. cdef int i
4. for i in range(x):
5. if i%2 == 0:
6. y += i
7. return y
في الشفرة الموضحة أعلاه ، يمكنك أن ترى أننا لم نقم بإجراء العديد من التغييرات بدلاً من إضافة أنواع البيانات أمام المتغير "y" و "i". بعض من إعلانات الكتابة هي كما يلي -:
def - وهي وظيفة بيثون منتظمة ، تستخدم في بايثون فقط.
cdef - هي وظائف Cython فقط ، ولهذا ، لا توجد ترجمة C لـ Python.
cpdef - سيخلق وظيفة C ومغطاة لبيثون. سنكون في الغالب باستخدام cpdef.
بناء وحدة التمديد
هناك بعض الطرق الأخرى لجعل هذا Cython قابل للتنفيذ ولكن المعيار هو بناء ملحق بايثون. حيث أن هذه الطرق تتجنب التجميع الديناميكي في كل مرة. لهذا ، نحتاج إلى إضافة ملف setup.py ويجب أن نبني في كل مرة كلما حدثت تغييرات معينة في شفرة Cython.
بعد إنشاء ملف setup.py هذا ، أنت على استعداد لاستيراد الشفرة الموضحة أعلاه (Cython) كوحدة نمطية وحرية لاستخدام وظائفها.
لنقم بإنشاء ملف الإعداد (setup.py)
قم بتشغيل هذا الأمر لإنشاء ملف setup.py لإنشاء مصدر c وملف امتداد Python لرمز Cython.
Command -:
"Python setup.py build_ext --inplace"
سوف يبني ويظهر مثل هذا النوع من النتائج -:
بعد تنفيذ هذا الأمر ، يمكنك التحقق من مجلدك وسيقوم بإنشاء ملفين جديدين مثل هذا:
أمل ، كل شيء واضح حتى الآن. الآن ، أنت على استعداد لاستيرادها كوحدة نمطية. الآن سوف يقوم بإنشاء ملف python جديد (check_module.py) وسيرى الفرق بين وقت حساب Python و Cython.
لنقم بإنشاء هذا الملف (checking_module.py)
1. import timeit
2. ## It will store the time taken by test_cy(Cython code) file with
repitions 1000.
3. cy = timeit.timeit('''test_cy.sum_even_no(500)''',setup = 'import
test_cy', number=1000)
4. ## It will store the time taken by test_py(Python code) file with
repitions 1000.
5. py = timeit.timeit('''test_py.sum_even_no(500)''',setup = 'import
test_py', number=1000)
6. print('Cython is {}x faster'.format(py/cy))
ناتج الكود أعلاه -:
سيثون هو 18.432300452810082x أسرع
في كل مرة تقوم بتشغيل هذا الرمز سيعطي مخرجات مختلفة.
في الكود أعلاه ، نقوم بحساب الوقت الذي يستغرقه نفس رمز Cython و Python Code. لذلك ، نحن نستخدم الوقت في وحدة بايثون وبألف تكرار ، أما بالنسبة للتشغيل الفردي ، فستعطي قيمة أقل ولن تكون قادرة على تحديد الفرق. يمكنك التحقق من خلال تغيير قيم المعلمات أيضًا مثل القيمة التي تم تمريرها في الدالة sum_even_no وعدد مرات التكرار.
المصدر https://www.nexsoftsys.com/articles/python-faster-using-cython.html