PyPy - यह संभवतः CPython को कैसे हरा सकता है?


264

से गूगल मुक्त स्रोत ब्लॉग :

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

यह कैसे हो सकता है? पायथन को लागू करने के लिए किस पायथन कार्यान्वयन का उपयोग किया गया था? CPython ? और एक PyPyPy या PyPyPyPy की क्या संभावना है कि वे अपना स्कोर पीट रहे हैं?

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


43
Nitpick: PyPy है PyPyPy। एक प्रक्षेपण ऑपरेटर के रूप में Py- * उपसर्ग के बारे में सोचें।
u0b34a0f6ae

ठीक। इसलिए PyPy को CPython से अधिक पसंद किया जाना चाहिए? क्या इसमें कोई कमियां हैं?
बाल्की

10
PyPy रनटाइम ऑप्टिमाइज़ेशन में उत्कृष्ट है, लेकिन इसकी अलग-अलग सराय इसे कई लोकप्रिय C एक्सटेंशन के साथ असंगत बनाती है ।
सेस टिम्मरमैन

4
लगभग सभी लोग इस सवाल को याद कर रहे हैं, कि कैसे एक स्पीड हासिल करना THEORETICALLY संभव है। लेकिन इसके बारे में सोचें: अजगर ट्यूरिंग मशीन की तरह कुछ भी कर सकता है। इसे कॉल कर सकते हैं gcc, सब के बाद। तो आप कुछ अजगर कोड भी लिख सकते हैं जो सीपीथॉन पर चलता है, जो कुछ अन्य अजगर कोड की व्याख्या करता है, इसे सी में अनुवाद करता है, और निष्पादित करता है gcc, और फिर संकलित प्रोग्राम को निष्पादित करता है। और यह तेज हो सकता है, अगर कोड को अक्सर पर्याप्त कहा जाता है।
osa

जवाबों:


155

Q1। यह कैसे हो सकता है?

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

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

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

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

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

Q3। और एक PyPyPy या PyPyPyPy की क्या संभावना है कि वे अपना स्कोर पीट रहे हैं?

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

अद्यतन: हाल ही में, एक सावधानीपूर्वक तैयार किए गए उदाहरण पर , PyPy ने इसी तरह के C प्रोग्राम के साथ संकलित किया gcc -O3। यह एक विवादित मामला है लेकिन कुछ विचारों को प्रदर्शित करता है।

Q4। कोई इस तरह की कोशिश क्यों करेगा?

आधिकारिक साइट से। https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement

हम प्रदान करने का लक्ष्य:


  • गतिशील भाषाओं के कार्यान्वयन के लिए एक सामान्य अनुवाद और समर्थन ढांचा ,
    भाषा विनिर्देश और कार्यान्वयन
    पहलुओं के बीच एक स्वच्छ अलगाव पर जोर देना । हम इसे RPython toolchain_ कहते हैं।

  • पायथन_ भाषा का एक सुसंगत, लचीला और तेज कार्यान्वयन जो निम्न-स्तरीय विवरणों को एनकोड करने के बिना नई उन्नत उच्च-स्तरीय सुविधाओं को सक्षम करने के लिए उपरोक्त टूलचैन का उपयोग करता है।

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

सी संकलक gcc C में लागू किया गया है, हास्केल संकलक GHC हास्केल में लिखा गया है। क्या आपके पास पायथन इंटरप्रेटर / कंपाइलर के पायथन में नहीं लिखे जाने का कोई कारण है?


82
यह उत्तर पूरी तरह से मुख्य विवरण को याद कर रहा है कि PyPy तेज कैसे है; हालांकि यह उल्लेख करता है कि PyPy वास्तव में Python में कार्यान्वित नहीं किया गया है, लेकिन RPython में, यह इंगित नहीं करता है कि Pythy दुभाषिया का उत्पादन करने के लिए RPython कोड को संकलित और अनुकूलित किया गया है (यह सिर्फ मान्य Python कोड को मान्य करता है जो शीर्ष पर चल सकता है CPython के बहुत धीरे-धीरे)। उन्होंने "सामान्य पायथन" में जो लागू किया है, वह है आरपीथॉन "संकलक" (ब्लॉक उद्धरण में उल्लिखित अनुवाद की रूपरेखा)।
बेन

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

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

2
खैर, ब्लॉग पोस्ट 2011 में था और 2014 में इसका जवाब था। इसके अलावा, टिप्पणी साझा पुस्तकालयों का उल्लेख करती है। मुझे नहीं पता कि यह (उत्तर और ब्लॉग पोस्ट) कितना मान्य है। पिछले कुछ वर्षों में सभी शामिल तकनीकों में बहुत बदलाव आया है।
नौफाल इब्राहिम

1
Pypy के दो ध्यान से तैयार किए गए उदाहरणों पर समतुल्य C की तुलना में तेज़ी से होने के कारण, प्रत्येक बहुत ही विशिष्ट कारणों के लिए बेंचमार्क में तेज़ है। पहला, क्योंकि पिप्पली इतनी स्मार्ट है कि तंग लूप गिनने वाली चीजों का कभी भी उपयोग नहीं किया जा सकता है, इसलिए इसे पूरी तरह से हटाया जा सकता है (जेआईटी पास) दूसरे के संयोजन के लिए: क्योंकि पिपी जेआईटी "लाइब्रेरी सीमाओं के पार" इनलाइन कर सकता है, दिया गया "प्रिंटफ" फ़ंक्शन के उदाहरण को विशेष रूप से केवल एक पूर्णांक का उत्सर्जन करने में सक्षम होने के लिए, और दोहराया मॉलोक (मेमोरी आवंटन ओवरहेड) को समाप्त करता है।
amcgregor

291

"PyPy Python में पायथन का पुन: कार्यान्वयन है" PyPy, IMHO का वर्णन करने के लिए एक भ्रामक तरीका है, हालांकि यह तकनीकी रूप से सच है।

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

  1. अनुवाद की रूपरेखा
  2. दुभाषी

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

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

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

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

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

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


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

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

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


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

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

23

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

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


क्या जेआईटी पायथन के समान पायथन कोड चला रहा है, या क्या यह वास्तविक देशी कोड उत्पन्न करता है जो कि पायथन कार्यान्वयन के स्तर पर चल रहा है जो PyPy पर चल रहा है?
एडमंड

3
वास्तविक देशी कोड ( यहां देखें ); 32-बिट x86 कोड सटीक होना चाहिए।
मार्सेलो कैंटोस

11

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

आपके प्रश्न से लगता है कि कोड को निष्पादित करते समय PyPy दुभाषिया CPython के शीर्ष पर चल रहा है। संपादित करें: हाँ, PyPy का उपयोग करने के लिए आप पहले PyPy python कोड का अनुवाद करते हैं, या तो C और gcc के साथ निर्माण करते हैं, jvm बाइट कोड के लिए, या .Net CLI कोड। देखना प्रारंभ करना


8
PyPy CPython के शीर्ष पर चलेगा, लेकिन इस विधा में वह गति प्राप्त नहीं कर सकता है जिसकी कोई इच्छा कर सकता है। :-) codespeak.net/pypy/dist/pypy/doc/…
फ्रैंक वी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.