واحدة من أفضل الطرق لتشغيل كود Python بشكل أسرع.

CCNA 200-301

CCNA 200-301

CCNP Enterprise

CCNP Enterprise

CCNP Security

CCNP Security

CCIE Enterprise Lab

CCIE Enterprise Lab

CCIE Security Lab

CCIE Security Lab

CCNP Service Provider

CCNP Service Provider

CCNP Data Center

CCNP Data Center

CCNP Collaboration

CCNP Collaboration

CCIE DC Lab

CCIE DC Lab

ic_r
ic_l
واحدة من أفضل الطرق لتشغيل كود Python بشكل أسرع.
images

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

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

لكن الحل البديل ليس مثاليًا أبدًا. ألن يكون من الرائع أن نتمكن من استخدام برنامج Python الحالي كما هو وتشغيله بشكل أسرع؟ هذا هو بالضبط ما يسمح لك PyPy بفعله.

PyPy وCPython

PyPy هو بديل مباشر لمترجم Python CPython. يقوم CPython بتجميع Python إلى بايت كود وسيط ثم يفسره بواسطة الآلة الافتراضية، بينما يستخدم PyPy التجميع في الوقت الفعلي (JIT) لتحويل كود Python إلى لغة التجميع الخاصة بالآلة المحلية.

يمكن أن تكون تحسينات الأداء كبيرة اعتمادًا على المهمة التي يتم إجراؤها. في المتوسط، تزيد PyPy من سرعة Python بنحو 7.6 مرة وبعض المهام بنحو 50 مرة أو أكثر. لا يقوم مفسّر CPython بنفس التحسينات التي يقوم بها PyPy على الإطلاق، وقد لا يقوم بذلك أبدًا لأن هذا ليس أحد أهداف تصميمه.

أفضل جزء هو أن المطورين لا يحتاجون إلى أي جهد أو جهد بسيط للاستفادة من المزايا التي توفرها PyPy. ما عليك سوى استبدال CPython بـ PyPy وستنتهي معظم هذه المشاكل. تتم مناقشة بعض الاستثناءات أدناه، ولكن هدف PyPy هو تشغيل كود Python الحالي غير المعدل وتوفير تحسينات في سرعة التشغيل الآلي.

يدعم PyPy حاليًا Python 2 وPython 3 من خلال إصدارات مختلفة من المشروع. بعبارة أخرى، تحتاج إلى تنزيل إصدار مختلف من PyPy، اعتمادًا على إصدار Python الذي تستخدمه. لقد كان فرع Python 2 من PyPy موجودًا منذ فترة طويلة، ولكن حتى الآن، تحسنت سرعة إصدار Python 3 كثيرًا. يدعم PyPy حاليًا Python 3.5 (الإصدار الصادر) وPython 3.6 (الإصدار التجريبي).

بالإضافة إلى دعم جميع لغات Python الأساسية، يمكن أيضًا استخدام PyPy مع معظم الأدوات في نظام Python البيئي، مثل pip للتغليف أو virtualenv للبيئات الافتراضية. ستعمل معظم حزم Python، حتى تلك التي تحتوي على وحدات C، كما هي. بالطبع، هناك بعض القيود، وسنقدم بعض القيود أدناه.

كيف يعمل PyPy؟

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

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

كما ينحرف PyPy عن الطريقة التي يتعامل بها CPython مع بعض الوظائف الداخلية، ولكنه يحاول أيضًا الحفاظ على السلوك المتوافق. على سبيل المثال، يتعامل PyPy مع جمع القمامة بشكل مختلف عن CPython. لا يتم استرداد جميع الكائنات بمجرد خروجها من النطاق، لذا فإن برامج Python التي تعمل تحت PyPy قد تشغل مساحة أكبر من الذاكرة مقارنة بتشغيلها تحت CPython. ولكن لا يزال بإمكانك استخدام عناصر التحكم المتقدمة في جمع القمامة في Python والمتاحة من خلال وحدة GC، مثل gc.enable() وgc.disable() وgc.collect().

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

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

قيود باي باي

قد يكون PyPy سحريًا مثل السحر، لكنه ليس سحريًا. كما أن PyPy لديه بعض القيود التي يمكن أن تضعف أو تلغي فعالية بعض البرامج. حسنًا، PyPy ليس بديلاً عالميًا كاملاً لوقت تشغيل CPython.

PyPy هو الأفضل لتطبيقات Python الخالصة

يعمل PyPy بشكل أفضل في تطبيقات Python "الخالصة"، بمعنى آخر، يعمل بشكل أفضل في التطبيقات المكتوبة بلغة Python دون أي لغة أخرى. ونظرًا للطريقة التي تحاكي بها PyPy واجهة CPython الثنائية الأصلية، فإن حزم Python التي تتفاعل مع مكتبات C (مثل NumPy) ليست بارزة جدًا.

لقد حل مطورو PyPy هذه المشكلة وجعلوا PyPy أكثر توافقًا مع معظم حزم Python التي تعتمد على ملحقات C. على سبيل المثال، أصبح Numpy الآن متوافقًا جدًا مع PyPy. ومع ذلك، إذا كنت تريد أن تكون أكثر توافقًا مع ملحقات C، فاستخدم CPython.

PyPy للبرامج طويلة الأمد

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

PyPy ليس مُجمَّعًا مسبقًا

يقوم PyPy بتجميع كود Python، ولكنه ليس مُجمِّعًا لكود Python. نظرًا للطريقة التي يقوم بها PyPy بإجراء تحسيناته والديناميكيات المتأصلة في Python، فمن غير الممكن إصدار وإعادة استخدام الكود الناتج JITted كملف ثنائي مستقل. يجب تجميع كل برنامج في كل تشغيل. إذا كنت تريد تجميع Python إلى كود أسرع يمكن تشغيله كتطبيق مستقل، فاستخدم Cython أو Numba أو مشروع Nuitka التجريبي الحالي.