سؤال

من مدونة Google Open Source:

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

كيف يكون هذا ممكنا؟ أي تطبيق Python كان يستخدم لتنفيذ Pypy؟ cpython؟ وما هي فرص التغلب على درجاتهم؟

(في ملاحظة ذات صلة ... لماذا يجرب أي شخص مثل هذا؟)

هل كانت مفيدة؟

المحلول

س 1. كيف يكون هذا ممكنا؟

يمكن أن تكون إدارة الذاكرة اليدوية (وهو ما يفعله Cpython مع عدها) أبطأ من الإدارة التلقائية في بعض الحالات.

تمنع القيود في تنفيذ مترجم Cpython تحسين بعض التحسينات التي يمكن لـ Pypy القيام بها (على سبيل المثال. أقفال الحبيبات الدقيقة).

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

س 2. أي تطبيق Python كان يستخدم لتنفيذ Pypy؟

يتم تنفيذ مترجم Pypy في Rpython وهو مجموعة فرعية مكتوبة بشكل ثابت من Python (اللغة وليس مترجم Cpython). - أشير https://pypy.readthedocs.org/en/latest/architecture.html للتفاصيل.

س 3. وما هي فرص التغلب على درجاتهم؟

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

تحديث: في الآونة الأخيرة ، على أ مثال مصنوع بعناية, ، تفوقت Pypy على برنامج C مماثل تم تجميعه مع gcc -O3. إنها حالة مفتعلة ولكنها تظهر بعض الأفكار.

س 4. لماذا يجرب أي شخص شيئًا كهذا؟

من الموقع الرسمي. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement

نهدف إلى توفير:

  • إطار ترجمة ودعم مشترك للإنتاج
    تطبيقات اللغات الديناميكية ، مع التركيز على نظافة
    الفصل بين مواصفات اللغة والتنفيذ
    النواحي. نسمي هذا RPython toolchain_.

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

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

يتم تنفيذ برنامج التحويل البرمجي C في C ، وكتب برنامج التحويل البرمجي Haskell GHC في Haskell. هل لديك أي سبب لعدم كتابة مترجم/مترجم بيثون في بيثون؟

نصائح أخرى

"Pypy عبارة عن إعادة تهيئة لـ Python في Python" هي وسيلة مضللة إلى حد ما لوصف Pypy ، IMHO ، على الرغم من أنها صحيحة من الناحية الفنية.

هناك جزءان رئيسيان من Pypy.

  1. إطار الترجمة
  2. المترجم

إطار الترجمة هو مترجم. يجمع rpython رمز وصولاً إلى C (أو أهداف أخرى) ، إضافة تلقائيًا في جوانب مثل مجموعة القمامة ومترجم JIT. هو - هي لا تستطيع التعامل مع رمز بيثون التعسفي ، فقط rpython.

Rpython هي مجموعة فرعية من الثعبان العادي. كل رمز Rpython هو رمز Python ، ولكن ليس العكس. لا يوجد تعريف رسمي لـ rpython ، لأن Rpython هو في الأساس مجرد "مجموعة فرعية من Python التي يمكن ترجمتها بواسطة Pypy's Translation Framework". ولكن من أجل ترجمة ، يجب أن يكون رمز rpython كتبت بشكل ثابت (تم استنتاج الأنواع ، لا تعلن عنها ، لكنها لا تزال بدقة نوع واحد لكل متغير) ، ولا يمكنك فعل أشياء مثل إعلان/تعديل الوظائف/الفئات في وقت التشغيل أيضًا.

المترجم المترجم ثم مترجم بيثون طبيعي مكتوب في rpython.

نظرًا لأن رمز Rpython هو رمز Python عادي ، يمكنك تشغيله على أي مترجم Python. لكن أي من مطالبات سرعة Pypy تأتي من تشغيلها بهذه الطريقة ؛ هذا فقط لدورة اختبار سريعة ، لأن ترجمة المترجم يأخذ أ طويل الوقت.

مع هذا المفهوم ، يجب أن يكون من الواضح على الفور أن التكهنات حول pypypy أو pypypypy لا معنى لها في الواقع. لديك مترجم مكتوب في rpython. يمكنك ترجمته إلى رمز C الذي ينفذ Python بسرعة. هناك توقف العملية. لم يعد هناك Rpython لتسريعه عن طريق معالجته مرة أخرى.

لذا ، "كيف يمكن أن يكون Pypy أسرع من Cpython" يصبح واضحًا إلى حد ما. يتمتع Pypy بتنفيذ أفضل ، بما في ذلك برنامج التحويل البرمجي JIT (لا يزيد سرعة ذلك بشكل سريع بدون برنامج التحويل البرمجي JIT ، مما يعني أن Pypy أسرع فقط للبرامج عرضة لمجلة JIT). لم يتم تصميم Cpython أبدًا ليكون تطبيقًا كبيرًا لتحسين لغة Python (على الرغم من أنهم يحاولون جعلها بشدة المحسن التنفيذ ، إذا اتبعت الفرق).


الجزء المبتكر حقًا من مشروع Pypy هو أنهم لا يكتبون مخططات GC متطورة أو مجمعين JIT باليد. يكتبون المترجم المترجم بشكل مباشر نسبيًا في Rpython ، وبالنسبة لجميع Rpython هو المستوى الأدنى من Python ، لا يزال هناك لغة تم جمعها موجهة نحو الكائنات ، وهي مستوى عالٍ أكثر بكثير من C. ثم إطار الترجمة تلقائيا يضيف أشياء مثل GC و JIT. لذا فإن إطار الترجمة هو تسربت الجهد ، ولكنه ينطبق بشكل جيد على مترجم Pypy Python ، لكنهم يغيرون تنفيذها ، مما يسمح بمزيد من الحرية في التجريب لتحسين الأداء (دون القلق بشأن إدخال أخطاء GC أو تحديث برنامج التحويل البرمجي JIT للتعامل مع التغييرات). هذا يعني أيضًا عندما يتجولون في تنفيذ مترجم Python3 ، سيحصل على نفس الفوائد تلقائيًا. وأي فترات فوريين آخرين مكتوبة بإطار Pypy (الذي يوجد رقم في مراحل مختلفة من البولندية). ودعم جميع المترجمين الفوريين الذين يستخدمون Pypy Framework تلقائيًا جميع المنصات التي تدعمها الإطار.

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

ويمكنه تشغيل برنامج Python بشكل أسرع (ربما).

يتم تنفيذ Pypy في Python ، لكنه يقوم بتنفيذ برنامج التحويل البرمجي JIT لإنشاء التعليمات البرمجية الأصلية أثناء الطيران.

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

Pypy مكتوب في بيثون مقيد. لا يعمل فوق مترجم Cpython ، بقدر ما أعرف. Python المقيدة هي مجموعة فرعية من لغة Python. AFAIK ، يتم تجميع مترجم Pypy إلى رمز الجهاز ، لذلك عند تثبيته ، لا يستخدم مترجم Python في وقت التشغيل.

يبدو أن سؤالك يتوقع أن يتم تشغيل مترجم Pypy فوق Cpython أثناء تنفيذ التعليمات البرمجية.تعديل: نعم ، لاستخدام Pypy ، تقوم أولاً بترجمة رمز Pypy Python ، إما إلى C وبناء مع GCC ، إلى رمز Byte JVM ، أو إلى .NET CLI Code. يرى ابدء

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top