2010-04-07 15 views
216

Google Open Source Blog से:पीपीपी - यह संभवतः सीपीथन को कैसे हरा सकता है?

PyPy उन्नत तकनीकों का उपयोग करते हुए CPython से बेहतर प्रदर्शन प्राप्त करने के लिए प्रयास करने के लिए, पायथन में अजगर की एक reimplementation है। कड़ी मेहनत के कई वर्षों ने आखिरकार भुगतान किया है। हमारी गति परिणाम को 0xएप्लिकेशन कोड पर 0x10x तक की गति के लिए छोटे बेंचमार्क पर 0xगतिशील होने से तक सीपीथॉन को हराते हैं।

यह कैसे संभव है? Pypy को लागू करने के लिए कौन सा पायथन कार्यान्वयन का उपयोग किया गया था? CPython? और PypyPy या PyPyPyPy के स्कोर को मारने की संभावना क्या है?

(एक संबंधित नोट ... पर क्यों किसी को भी कुछ इस तरह की कोशिश करेंगे?)

+32

नाइटपिक: पीपीपी * है * पायपीपी। प्रोजेक्शन ऑपरेटर के रूप में Py- * उपसर्ग के बारे में सोचें। – u0b34a0f6ae

+0

ठीक है। इसलिए पीपीपी को सीपीथन से पसंद किया जाना चाहिए? क्या इसमें कोई कमी है? – balki

+8

पीईपीई रनटाइम ऑप्टिमाइज़ेशन पर उत्कृष्ट है, लेकिन इसके विभिन्न अंदरूनी इसे कई लोकप्रिय सी एक्सटेंशन के साथ [असंगत] (https://bitbucket.org/pypy/compatibility/wiki/Home) बनाते हैं। –

उत्तर

133

प्रश्न 1। यह कैसे संभव है?

मैन्युअल मेमोरी मैनेजमेंट (जो कि सीपीथॉन अपनी गिनती के साथ करता है) कुछ मामलों में स्वचालित प्रबंधन से धीमा हो सकता है।

सीपीथॉन दुभाषिया के कार्यान्वयन में सीमाएं कुछ अनुकूलन को रोकती हैं जो पीपीपी कर सकती है (उदाहरण के लिए। ठीक दागदार ताले)।

जैसा कि मार्सेलो ने उल्लेख किया, जेआईटी। फ्लाई पर सक्षम होने के कारण पुष्टि करें कि किसी ऑब्जेक्ट के प्रकार से आपको कॉल करने के लिए जिस विधि को कॉल करना है, उस पर पहुंचने के लिए आपको कई पॉइंटर ड्रेफरेंस करने की आवश्यकता बचा सकती है।

प्रश्न 2। पाइपी को लागू करने के लिए किस पायथन कार्यान्वयन का उपयोग किया गया था?

पीपीपी दुभाषिया RPython में लागू किया गया है जो पाइथन (भाषा और सीपीथन दुभाषिया नहीं) का एक स्थिर रूप से टाइप किया गया सबसेट है। - विवरण के लिए https://pypy.readthedocs.org/en/latest/architecture.html देखें।

क्यू 3। और PypyPy या PyPyPyPy के स्कोर को मारने की संभावना क्या है?

यह इन hypothetical दुभाषियों के कार्यान्वयन पर निर्भर करेगा। उदाहरण के लिए उनमें से एक ने स्रोत लिया, इस पर कुछ प्रकार का विश्लेषण किया और इसे थोड़ी देर के लिए चलने के बाद सीधे तंग लक्ष्य विशिष्ट असेंबली कोड में परिवर्तित कर दिया, मुझे लगता है कि यह सीपीथन से काफी तेज़ होगा।

अद्यतन: हाल ही में, एक carefully crafted example पर, PyPy एक ऐसी ही सी कार्यक्रम gcc -O3 साथ संकलित बेहतर प्रदर्शन किया। यह एक आकस्मिक मामला है लेकिन कुछ विचारों को प्रदर्शित करता है।

क्यू 4। कोई ऐसा कुछ क्यों कोशिश करेगा?

आधिकारिक साइट से।

  • एक आम अनुवाद और समर्थन ढांचे गतिशील भाषाओं के
    कार्यान्वयन के उत्पादन, भाषा विनिर्देश और कार्यान्वयन
    पहलुओं के बीच एक साफ
    जुदाई पर बल के लिए: https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement

    हम प्रदान करना है। हम इसे RPython toolchain _ कहते हैं।

  • Python_ भाषा जो निम्न स्तर एन्कोड करने के लिए विवरण बिना नए उन्नत उच्च स्तरीय सुविधाओं को सक्षम करने से ऊपर toolchain का उपयोग करता है की एक, शिकायत लचीला और तेजी से कार्यान्वयन।

इस तरह से अलग चिंताओं, अजगर के बारे में हमारी कार्यान्वयन करके - और अन्य गतिशील भाषाओं - स्वचालित रूप से किसी भी गतिशील भाषा के लिए एक जस्ट-इन-टाइम संकलक उत्पन्न करने में सक्षम है। यह कई सहित कार्यान्वयन निर्णयों के मिश्रण और मिलान दृष्टिकोण को भी लक्ष्य प्लेटफ़ॉर्म, मेमोरी और थ्रेडिंग मॉडल, कचरा संग्रह रणनीतियों और अनुकूलन लागू करने सहित कार्यान्वित निर्णयों के लिए मिश्रण-और-मिलान दृष्टिकोण की अनुमति देता है, भले ही या पर पहली जगह में एक जेआईटी नहीं है।

सी कंपाइलर जीसीसी सी में लागू किया गया है, हास्केल कंपाइलर जीएचसी हास्केल में लिखा गया है। क्या आपके पास पाइथन में लिखे जाने वाले पायथन दुभाषिया/कंपाइलर के लिए कोई कारण नहीं है?

+69

यह उत्तर पूरी तरह से मुख्य व्याख्या को याद कर रहा है कि पीपीपी तेज़ कैसे है; जबकि यह उल्लेख करता है कि पाइपी वास्तव में पायथन में लागू नहीं किया गया है, लेकिन RPython में, यह इंगित नहीं करता है कि RPYy दुभाषिया का उत्पादन करने के लिए RPYthon कोड * स्थिर रूप से संकलित और अनुकूलित * है (यह केवल वैध पायथन कोड भी होता है जो चला सकता है सीपीथॉन के शीर्ष पर बहुत धीरे धीरे)। उन्होंने "सामान्य पायथन" में जो कार्यान्वित किया है वह RPython "कंपाइलर" है (ब्लॉक उद्धरण में निर्दिष्ट अनुवाद ढांचा)। – Ben

+11

यह नेतृत्व को दफन कर रहा है। अधिकांश प्रदर्शन अनुवाद से सी तक आता है (जो दुभाषिया को सीपीथन से बहुत धीमा नहीं बनाता है), और जेआईटी, जो गर्म पथ को बहुत तेज बनाता है। – Tobu

+3

* "अद्यतन: हाल ही में, एक सावधानी से तैयार किए गए उदाहरण पर, पीपीपी ने जीसीसी-ओ 3 के साथ संकलित एक समान सी प्रोग्राम को बेहतर प्रदर्शन किया।" * और यदि आप उस पोस्ट के तहत पहली टिप्पणी पढ़ते हैं, तो आप देखेंगे कि उस पोस्ट का लेखक नहीं है लिंक-टाइम अनुकूलन पता है। लिंक-टाइम अनुकूलन सक्षम होने के साथ, सी कोड तेज़ी से चलता है। – Ali

22

PyPy अजगर में कार्यान्वित किया जाता है, लेकिन यह एक JIT कम्पाइलर मक्खी पर मूल कोड उत्पन्न करने के लिए लागू करता है।

पायथन के शीर्ष पर पीपीपी लागू करने का कारण शायद यह है कि यह केवल एक बहुत ही उत्पादक भाषा है, खासकर जब से जेआईटी कंपाइलर मेजबान भाषा का प्रदर्शन कुछ हद तक अप्रासंगिक बनाता है।

+0

क्या जेआईटी पाइथन कोड को पीपीपी के समान स्तर पर चलाता है, या क्या यह वास्तविक मूल कोड उत्पन्न करता है जो कि पाइथन कार्यान्वयन पीईपीई के स्तर पर चल रहा है? – Edmund

+3

असली मूल कोड (देखें [यहां] (http://pypy.org/download.html#with-a-jit-compiler)); 32-बिट x86 कोड सटीक होना चाहिए। –

11

पीईपीई प्रतिबंधित पायथन में लिखा गया है। जहां तक ​​मुझे पता है, यह सीपीथॉन दुभाषिया के शीर्ष पर नहीं चलता है। प्रतिबंधित पायथन पाइथन भाषा का सबसेट है। AFAIK, पीपीपी दुभाषिया को मशीन कोड में संकलित किया गया है, इसलिए जब इसे स्थापित किया जाता है तो यह रनटाइम पर एक अजगर दुभाषिया का उपयोग नहीं करता है।

आपका प्रश्न कोड निष्पादित करते समय पीपीपी दुभाषिया सीपीथॉन के शीर्ष पर चल रहा है। संपादित करें: हाँ, पीईपीई का उपयोग करने के लिए आप पहले पीपीपी पायथन कोड का अनुवाद करते हैं, या तो सी और जीसीसी के साथ जीवीएम बाइट कोड, या नेट सीएलआई कोड के लिए। Getting Started

+7

पीपीपी सीपीथॉन के शीर्ष पर चलेगा लेकिन इस मोड में यह स्पीड लाभ प्रदान नहीं करेगा जो कोई चाह सकता है। :-) http://codespeak.net/pypy/dist/pypy/doc/getting-started-python.html#id9 –

253

"पीईपीई पायथन में पाइथन का पुनर्मूल्यांकन है" पीपीपीई, आईएमएचओ का वर्णन करने के बजाय एक भ्रामक तरीका है, हालांकि यह तकनीकी रूप से सच है।

पीपीपी के दो प्रमुख भाग हैं।

  1. अनुवाद ढांचे
  2. दुभाषिया

अनुवाद ढांचा एक संकलक है। यह RPython को सी (या अन्य लक्ष्यों) तक कोड संकलित करता है, जो स्वचालित रूप से कचरा संग्रह और एक जेआईटी कंपाइलर जैसे पहलुओं में जोड़ता है। यह मनमाने ढंग से पाइथन कोड, केवल RPython संभाल नहीं सकता है।

RPython सामान्य पायथन का सबसेट है; सभी RPython कोड पायथन कोड है, लेकिन दूसरी तरफ नहीं। RPython की कोई औपचारिक परिभाषा नहीं है, क्योंकि RPython मूल रूप से केवल "पायथन का सबसेट है जिसका अनुवाद पीपीपी के अनुवाद ढांचे द्वारा किया जा सकता है"। लेकिन अनुवाद करने के लिए, RPython कोड होना चाहिए 0 सांख्यिकीय रूप से टाइप (प्रकार अनुमानित हैं, आप उन्हें घोषित नहीं करते हैं, लेकिन यह अभी भी एक चर प्रति चर है), और आप घोषणा/संशोधन जैसी चीजें नहीं कर सकते रनटाइम पर कार्य/कक्षाएं या तो।

दुभाषिया तब एक सामान्य पायथन दुभाषिया है जिसे RPython में लिखा गया है।

क्योंकि RPython कोड सामान्य पायथन कोड है, तो आप इसे किसी भी पायथन दुभाषिया पर चला सकते हैं। लेकिन पीपीपी के गति दावों में से कोई भी इस तरह से चलने से नहीं आता है; यह सिर्फ एक तेज परीक्षण चक्र के लिए है, क्योंकि दुभाषिया का अनुवाद लंबा समय लेता है।

समझने के साथ, यह तुरंत स्पष्ट होना चाहिए कि PyPyPy या PyPyPyPy के बारे में अनुमान वास्तव में कोई समझ नहीं लेते हैं। आपके पास RPython में लिखा गया एक दुभाषिया है। आप इसे सी कोड में अनुवाद करते हैं जो पाइथन को जल्दी से निष्पादित करता है। वहां प्रक्रिया बंद हो जाती है; इसे फिर से संसाधित करके तेज करने के लिए कोई और RPython नहीं है।

तो "पीपीपी के लिए सीपीथॉन की तुलना में तेज़ होना संभव है" यह भी स्पष्ट रूप से स्पष्ट हो जाता है। पीआईपीई के पास एक बेहतर कार्यान्वयन है, जिसमें एक जेआईटी कंपाइलर शामिल है (यह आमतौर पर जेआईटी कंपाइलर के बिना जितना तेज़ नहीं है, मेरा मानना ​​है, जिसका मतलब है कि पीईपीई जेआईटी-संकलन के लिए अतिसंवेदनशील कार्यक्रमों के लिए केवल तेज़ है)। सीपीथॉन को कभी भी पायथन भाषा का अत्यधिक अनुकूलन करने के लिए डिज़ाइन नहीं किया गया था (हालांकि यदि आप अंतर का पालन करते हैं तो इसे अनुकूलित कार्यान्वयन करने का प्रयास करते हैं)।


PyPy परियोजना की वास्तव में अभिनव बिट है कि वे हाथ से परिष्कृत जीसी योजनाओं या JIT compilers नहीं लिखते है। वे RPython में अपेक्षाकृत सरल रूप से दुभाषिया लिखते हैं, और सभी RPython पाइथन से कम स्तर के लिए है, यह अभी भी एक ऑब्जेक्ट उन्मुख कचरा एकत्रित भाषा है, सी से अधिक उच्च स्तर है। फिर अनुवाद ढांचे स्वचालित रूप से जीसी और जेआईटी जैसी चीजें जोड़ता है। तो अनुवाद ढांचा विशाल प्रयास है, लेकिन यह पीपीपी पायथन दुभाषिया के लिए समान रूप से अच्छी तरह से लागू होता है, हालांकि वे अपने कार्यान्वयन को बदलते हैं, जिससे प्रदर्शन में सुधार करने के लिए प्रयोग में अधिक स्वतंत्रता की अनुमति मिलती है (जीसी बग शुरू करने या जेआईटी कंपाइलर को अपडेट करने के बारे में चिंता किए बिना परिवर्तनों का सामना करना पड़ता है)। इसका अर्थ यह भी है कि जब वे पाइथन 3 दुभाषिया को लागू करने के लिए चारों ओर जाते हैं, तो यह स्वचालित रूप से वही लाभ प्राप्त करेगा। और पीपीपी फ्रेमवर्क के साथ लिखे गए किसी भी अन्य दुभाषिया (जिनमें से पॉलिश के विभिन्न चरणों में एक संख्या है)। और पीपीपी फ्रेमवर्क का उपयोग कर सभी दुभाषिया स्वचालित रूप से ढांचे द्वारा समर्थित सभी प्लेटफार्मों का समर्थन करते हैं।

तो पीपीपी परियोजना का वास्तविक लाभ एक गतिशील भाषा के लिए एक कुशल मंच-स्वतंत्र दुभाषिया को लागू करने के सभी हिस्सों को अलग करना (जितना संभव हो) अलग करना है। और उसके बाद एक ही स्थान पर उनके एक अच्छे कार्यान्वयन के साथ आते हैं, जिसे कई दुभाषियों में फिर से उपयोग किया जा सकता है। यह तत्काल जीत नहीं है जैसे "मेरा पायथन प्रोग्राम अब तेजी से चलता है", लेकिन यह भविष्य के लिए एक बड़ी संभावना है।

और यह आपके पायथन प्रोग्राम को तेज़ी से चला सकता है (शायद)।

+11

यह अब तक की सबसे अच्छी व्याख्याओं में से एक है। मैंने पीकपी के दौरान पीईपीई पर डेविड बेज़ली की बात भी देखी लेकिन चबाने में बहुत मुश्किल थी। : पी – Chirag

+3

मैं अंतर का पालन नहीं कर सका :( – polvoazul

+27

@ पोल्वोज़ुल * अनुकूलित * भाषा कार्यान्वयन और * अनुकूलन * के बीच का अंतर? ठीक है, जब मैं कहता हूं कि सीपीथन एक अच्छी तरह से अनुकूलित कार्यान्वयन है, तो मेरा मतलब है कि डेवलपर बनाने की कोशिश करते हैं दुभाषिया के आंतरिक एल्गोरिदम स्वयं और अंतर्निहित डेटा संरचनाएं कुशलता से चलती हैं। एक * अनुकूलन * कार्यान्वयन, ओटीओएच, * अंतिम उपयोगकर्ताओं * कोड का विश्लेषण करेगा और इसे अधिक कुशलतापूर्वक निष्पादित करने के लिए इसे बदलने के तरीकों को समझने का प्रयास करेगा। – Ben

संबंधित मुद्दे