पायथन (और अन्य गतिशील भाषाओं) की शब्दार्थ विशेषताएं इसकी सुस्ती में क्या योगदान देती हैं?


26

मैं बहुत अच्छी तरह से अजगर को नहीं जानता। मैं और अधिक सटीक रूप से समझने की कोशिश कर रहा हूं कि डायनेमिक भाषाओं की सटीक विशेषताएं (अ ला पायथन, लुआ, स्कीम, पर्ल, रूबी, ....) उनके कार्यान्वयन को धीमा करने के लिए मजबूर कर रही हैं।

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

इसके अलावा, मेरे पास अंतर्ज्ञान (शायद एक गलत है) है कि चूंकि वर्तमान प्रोसेसर पर मेमोरी कच्ची संगणना की तुलना में बहुत धीमी है (कैश मिस के साथ मेमोरी एक्सेस को उसी समय की आवश्यकता है जैसे सैकड़ों अंकगणितीय संचालन), डायनेमिक प्रकार की जाँच (एक ला if (value->type != INTEGER_TAG) return;में) C पार्लियामेंट) काफी तेज दौड़ सकता था।

बेशक, पूरे कार्यक्रम विश्लेषण (जैसे स्टालिन योजना कार्यान्वयन कर रहा है) एक गतिशील भाषा कार्यान्वयन कर सकता है क्योंकि एक अनुवादक तेजी से चलता है, लेकिन चलो नाटक करते हैं मेरे पास पहले से पूरे कार्यक्रम विश्लेषक को डिजाइन करने का समय नहीं है।

(मैं अपने MELT मॉनीटर में एक गतिशील भाषा को डिजाइन करने के लिए तैयार हूं , और इसमें से कुछ का अनुवाद C से किया जाएगा)



1
Lua Performance Tips , जिसमें बताया गया है कि क्यों कुछ Lua प्रोग्राम धीमा हैं और उन्हें कैसे ठीक किया जाए।
रॉबर्ट हार्वे

जवाबों:


24

पायथन (और अन्य गतिशील भाषाओं) की शब्दार्थ विशेषताएं इसकी सुस्ती में क्या योगदान देती हैं?

कोई नहीं।

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

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

CPython बस बहुत सी चीजें नहीं करता है जो गतिशील भाषाओं (या बल्कि गतिशील प्रेषण) को तेज बनाता है: गतिशील संकलन (JIT), गतिशील अनुकूलन, सट्टा inlining, अनुकूली अनुकूलन, गतिशील de- अनुकूलन, गतिशील प्रकार प्रतिक्रिया / अनुमान। वहाँ भी समस्या है कि लगभग पूरे कोर और मानक पुस्तकालय सी में लिखा है, जिसका अर्थ है कि भले ही आप अचानक से 100x तेज कर दें, यह आपकी बहुत मदद नहीं करेगा, क्योंकि 95% कोड की तरह कुछ एक द्वारा निष्पादित पायथन प्रोग्राम C है, पायथन नहीं है। यदि सब कुछ पायथन में लिखा गया था, तो भी मध्यम स्पीडअप एवाल्चे को एक प्रभाव पैदा करेगा, जहां एल्गोरिदम तेज हो जाते हैं, और कोर डेटास्ट्रक्चर तेज हो जाते हैं, लेकिन निश्चित रूप से कोर डेटा संरचनाएं एल्गोरिदम, और कोर डेटा और कोर डेटा का भी उपयोग किया जाता है। हर जगह संरचनाओं का उपयोग किया जाता है,

आज की प्रणालियों में स्मृति-प्रबंधित OO भाषाओं (डायनामिक या नहीं) के लिए बहुत कुछ खराब है। वर्चुअल मेमोरी और मेमोरी प्रोटेक्शन विशेष रूप से कचरा संग्रह प्रदर्शन और सामान्य रूप से सिस्टम प्रदर्शन के लिए एक हत्यारा हो सकता है। और यह एक मेमोरी-सुरक्षित भाषा में पूरी तरह से अनावश्यक है: जब कोई मेमोरी एक्सेस शुरू नहीं होती है, तो अवैध मेमोरी एक्सेस से सुरक्षा क्यों करें? अज़ुल ने आधुनिक शक्तिशाली MMUs (Intel Nehalem और नए, और AMD के समतुल्य) का उपयोग करके कचरा संग्रह में बाधा डालने के बजाय इसका उपयोग करने का अनुमान लगाया है , लेकिन भले ही यह CPU द्वारा समर्थित हो, लेकिन मुख्यधारा OS के वर्तमान मेमोरी सबसिस्टम पर्याप्त शक्तिशाली नहीं हैं यह अनुमति देने के लिए (यही कारण है कि अज़ुल की जेवीएम वास्तव में इसके अलावा नंगे धातु पर वर्चुअलाइज्ड चलती है ओएस, इसके भीतर नहीं)।

सिंगुलैरिटी OS प्रोजेक्ट में, Microsoft ने प्रक्रिया पृथक्करण के प्रकार के बजाय MMU सुरक्षा का उपयोग करते समय सिस्टम प्रदर्शन पर ~ 30% के प्रभाव को मापा है।

अज़ुल ने एक और चीज़ देखी जब उनके विशेष जावा सीपीयू का निर्माण किया गया था कि आधुनिक मुख्यधारा सीपीयू कैश मिस की लागत को कम करने की कोशिश करते समय पूरी तरह से गलत चीज़ पर ध्यान केंद्रित करते हैं: वे शाखा भविष्यवाणी, मेमोरी प्रीफ़ैक्शन जैसी चीजों के माध्यम से कैश मिस की संख्या को कम करने की कोशिश करते हैं। और इसी तरह। लेकिन, एक भारी बहुरूपिक OO कार्यक्रम में, उपयोग के पैटर्न मूल रूप से छद्म-यादृच्छिक होते हैं, बस भविष्यवाणी करने के लिए कुछ भी नहीं है। इसलिए, उन सभी ट्रांजिस्टर को सिर्फ बर्बाद किया जाता है, और इसके बजाय किसी को क्या करना चाहिए, प्रत्येक व्यक्तिगत कैश मिस की लागत को कम कर रहा है। (कुल लागत #misses * लागत है, मुख्यधारा पहले नीचे लाने की कोशिश करती है, दूसरे को अज़ुल।) अज़ुल के जावा कम्प्यूट एक्सलेरेटर उड़ान में 20000 समवर्ती कैश मिस हो सकते हैं और अभी भी प्रगति कर सकते हैं।

जब Azul शुरू कर दिया है, वे सोचा वे कुछ ऑफ-द-शेल्फ आई / ओ घटक लेने के लिए और अपने स्वयं के विशेष सीपीयू कोर डिजाइन होगा, लेकिन क्या वे वास्तव में समाप्त हो गया की आवश्यकता होगी, ऐसा करने के लिए ठीक विपरीत था: वे एक नहीं बल्कि मानक ऑफ मिलने वाली ले लिया शेल्फ 3-एड्रेस RISC कोर और अपने स्वयं के मेमोरी कंट्रोलर, MMU और कैश सबसिस्टम को डिज़ाइन किया।

tl; dr : पायथन की "सुस्ती" भाषा की एक संपत्ति नहीं है, लेकिन (ए) इसके भोले (प्राथमिक) कार्यान्वयन, और ख) यह तथ्य है कि आधुनिक सीपीयू और ओएस को विशेष रूप से सी रन तेज बनाने के लिए डिज़ाइन किया गया है, और वे विशेषताएँ C के लिए या तो मदद नहीं कर रहे हैं (कैश) या यहां तक ​​कि सक्रिय रूप से (वर्चुअल मेमोरी) पायथन परफॉर्मेंस को नुकसान पहुंचा रहे हैं।

और आप गतिशील एड-हॉक बहुरूपता के साथ किसी भी स्मृति-प्रबंधित भाषा को बहुत अधिक सम्मिलित कर सकते हैं ... जब एक कुशल कार्यान्वयन की चुनौतियों की बात आती है, तो पायथन और जावा भी बहुत हद तक "समान भाषा" हैं।


क्या आपके पास अज़ुल के लिए एक लिंक या संदर्भ है?
बेसिल स्टायरनेविच

4
मैं असहमत हूं कि किसी भाषा के शब्दार्थ का कुशलता से लागू होने की क्षमता पर कोई प्रभाव नहीं पड़ता है। हां, प्रथम श्रेणी के अनुकूलन और विश्लेषण के साथ एक अच्छा JIT कार्यान्वयन एक भाषा के प्रदर्शन में भारी सुधार कर सकता है , लेकिन अंत में शब्दार्थ के कुछ पहलू हैं जो अपरिहार्य रूप से अड़चन बनेंगे। चाहे वह बिंदुओं के कड़ाई से अलियासिंग के लिए C की आवश्यकता हो या पायथन की आवश्यकता कि सूची संचालन को एटोमिक रूप से किया जाए, कुछ सिमेंटिक निर्णय हैं जो कुछ अनुप्रयोगों के प्रदर्शन को अनजाने में समाप्त करते हैं।
जूल्स

1
एक तरफ ... क्या आपके पास विलक्षणता के लिए उस 30% सुधार का संदर्भ है? मैं कई वर्षों से भाषा-आधारित संरक्षण ओएस का एक वकील रहा हूं, लेकिन इससे पहले कभी भी उस आंकड़े को नहीं देखा है, और इसे काफी चौंकाने वाला पाया है (मैंने पिछले दिनों जो आंकड़े देखे हैं वे 10% के करीब हैं) और आश्चर्य है कि क्या उन्होंने इतना सुधार पाने के लिए ...
जूल्स 16

5
@MasonWheeler: क्योंकि वहाँ केवल भद्दे पायथन कार्यान्वयन हैं। किसी भी पायथन को लागू करने वाले ने पैसे, लोगों, शोध और संसाधनों के छोटे से अंश को भी खर्च नहीं किया है, आईबीएम, सन, ओरेकल, गूगल और कंपनी ने जे 9, जेआरकॉइट, हॉटस्पॉट और कं। सभी 5 पायथन कार्यान्वयन को संयुक्त रूप से खर्च किया है। जनशक्ति है कि ओरेकल कचरा कलेक्टर पर खर्च कर रहा है। आईबीएम ग्रहण ओएमआर (जे 9 से निकाले गए घटक खुले खट्टे वीएम फ्रेमवर्क) के आधार पर पायथन कार्यान्वयन पर काम कर रहा है, मैं शर्त लगाने को तैयार हूं कि इसका प्रदर्शन जे 9 के विशाल आदेश के भीतर अच्छी तरह से हो जाएगा
जोग मित्तग

2
रिकॉर्ड के लिए सी , संख्यात्मक कार्यो के लिए फोरट्रान की तुलना में धीमा है क्योंकि फोर्ट्रान सख्त अलियासिंग को लागू करता है इसलिए आशावादी अधिक आक्रामक हो सकता है।
माइकल शोप्सिन

8

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

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

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

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


3
बाद के बिंदु को evalफिर से संकलित और / या डी-अनुकूलन को ट्रिगर करके कम किया जा सकता है ।
जोर्ग डब्ल्यू मित्तग

4
वैसे, यह पायथन के लिए अद्वितीय नहीं है, या तो। Java (या JVM) में डायनेमिक कोड लोडिंग और डायनेमिक लिंकिंग है, इसलिए क्लास हायरार्की एनालिसिस हॉल्टिंग प्रॉब्लम को हल करने के बराबर है। फिर भी, हॉटस्पॉट ख़ुशी-ख़ुशी ख़ुशी-ख़ुशी पॉलीमॉर्फिक पद्धतियों को रेखांकित करता है, और अगर वर्ग पदानुक्रम में कुछ बदलता है, तो ठीक है, यह सिर्फ उन्हें वापस ले जाएगा।
डब्ल्यू पर जोर्ग डब्ल्यू मित्तग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.