जावा की तुलना में पायथन धीमा क्यों है लेकिन PHP की तुलना में तेज [बंद]


17

मैंने कई बार विभिन्न बेंचमार्क देखे हैं जो बताते हैं कि किसी दिए गए कार्य पर भाषाओं का एक समूह कैसे प्रदर्शन करता है।

ये मानदंड हमेशा प्रकट करते हैं कि पायथन जावा की तुलना में धीमा है, और PHP की तुलना में तेज है, और मुझे आश्चर्य है कि ऐसा क्यों है।

  • जावा, पायथन और PHP एक वर्चुअल मशीन के अंदर चलते हैं
  • सभी तीन भाषाएं अपने कार्यक्रमों को अपने कस्टम बाइट कोड में बदल देती हैं जो ओएस के शीर्ष पर चलते हैं - इसलिए कोई भी मूल रूप से नहीं चल रहा है
  • जावा और पाइथन दोनों को "संकलित" ( .pycपायथन के लिए) किया जा सकता है, लेकिन __main__पाइथन के लिए मॉड्यूल संकलित नहीं है

पायथन और PHP गतिशील रूप से टाइप किए गए हैं, और जावा सांख्यिकीय रूप से - यही कारण है कि जावा तेज है, और यदि हां, तो कृपया बताएं कि गति को कैसे प्रभावित करता है।

और, भले ही डायनेमिक-बनाम-स्टेटिक तर्क सही हो, यह नहीं बताता है कि पीएचपी पायथन की तुलना में धीमा क्यों है - क्योंकि दोनों गतिशील भाषाएं हैं।

आप कुछ मानक देख सकते हैं यहां और यहां , और यहां


पायथन बनाम पीएचपी के बारे में: यह कार्यान्वयन के मुद्दे का सिर्फ एक गुण है, सबसे अधिक संभावना है।
चार्ल्स साल्विया

8
@good_computer अधिकांश बेंचमार्क बहुत बुरी तरह से किए गए हैं। हाल ही में एक और एक था (मुझे नहीं लगता कि आपने लिंक किया है) कि ज्यादातर लोग जिन्होंने इसकी समीक्षा की, उन्होंने शिकायत की कि जिस भाषा ने "सबसे तेज़" होने का दावा किया था, उसके पास सबसे अच्छा अनुकूलित कोड था। यह आमतौर पर किसी व्यक्ति द्वारा अनजाने में उन भाषाओं से परिचित नहीं किया जाता है जो "धीमी" समझी जाने वाली भाषाओं से परिचित हैं, इसलिए उन्हें एहसास नहीं होता है कि वे "तेज़" पाए जाने वाले लोगों में बेहतर कोड लिख रहे हैं।
इज़काता 14

@good_computer मुझे लगता है कि आप कुछ दावा कर रहे हैं, क्योंकि आपके प्रश्न में यह पाठ शामिल है " हमेशा इन बेंचमार्क से पता चलता है कि पायथन धीमा है, तो जावा और PHP की तुलना में तेज़ है " और " PHP पायथन की तुलना में धीमा है "। उन उद्धरणों को हटाने और भाषा अज्ञेय होने के सवाल को फिर से खोलने से इसे फिर से खोला जा सकता है।
१५:०२

यह सवाल वास्तव में पक्षपाती है : (1) गैर-अनुकूलित गैर-अनुकूलित कोड पर गैर-अनुकूलित कोड पर लिखे गए गैर-अनुकूलित कोडों का जिक्र उन भाषाओं में किया जाता है जिनमें वे मास्टर नहीं होते (जैसा कि संबंधित टिप्पणी थ्रेड में विच्छेदित है) और (2) गलत धारणाओं से निर्मित के बारे में व्याख्या की / बाइटकोड भाषाओं (php / python की व्याख्या की जाती है, जावा की बायटेकटेड, पाइथन कैश फाइलें सार सिंटैक्स ट्री हैं, बायटेकोड नहीं) और तीन भाषाओं की स्थिति (दोनों पायथन और php - पायथन के संकलित संस्करण हैं) अधिक परिपक्व, संकलित हैं। php, हालाँकि, facebook चलाता है)
ZJR

जवाबों:


26

JVM कोड को JIT- संकलित करके कुशलतापूर्वक, एक तुच्छ (और तेज़) तदर्थ संकलक का उपयोग किया जा सकता है। लेकिन वही PHP और पायथन के लिए असाधारण रूप से कठिन होगा, क्योंकि उनके गतिशील रूप से टाइप किए गए स्वभाव के कारण। JVM काफी निम्न स्तर और सरल देशी कोड में अनुवाद करता है, जो C ++ कंपाइलर के उत्पादन के समान है, लेकिन गतिशील भाषाओं के लिए आपको वस्तुतः सभी बुनियादी कार्यों के लिए और सभी विधि कॉलों के लिए डायनेमिक प्रेषण उत्पन्न करना होगा। यह गतिशील प्रेषण इस तरह की सभी भाषाओं के लिए प्राथमिक अड़चन है।

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

पायथन और पीएचपी के बीच अंतर के लिए, उत्तरार्द्ध बहुत कम गुणवत्ता का है। यह सिद्धांत रूप में तेजी से चल सकता है, लेकिन यह कभी नहीं होगा।


1
गतिशील भाषाओं के लिए JIT "असाधारण" क्यों कठिन है? जावास्क्रिप्ट दुनिया में v8 या TraceMonkey को देखें - वहां JIT ठीक काम करती है।
ट्रेकरोड

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

2
ओरेकल के हॉटस्पॉट कंपाइलर टीम के अंदर शायद एक सौ या इतने ही इंजीनियर हैं जो "तुच्छ" भाग के बारे में असहमत होंगे :-)
जोर्ग डब्ल्यू मित्तग

1
@ JörgWMittag, बेशक, हॉटस्पॉट इतना सीधा नहीं है, यह थोड़ा स्थिर विश्लेषण करता है, यह रनटाइम प्रोफाइलिंग परिणामों का उपयोग कर रहा है, लेकिन फिर भी यह एक उचित ट्रेसिंग JIT की तुलना में बहुत सरल है। और, मैं कहूंगा, हॉटस्पॉट अतिविशिष्ट है और इसका कार्यान्वयन, इसे विनम्रता से करने के लिए है, थोड़ा बहुत क्रिया।
SK-तर्क

1
@Frank Shearar, एक गतिशील भाषा के लिए एक तदर्थ JIT उतना ही तुच्छ है जितना कि एक स्टेटिकली टाइप के लिए (उदाहरण के लिए LuaJIT देखें)। OTOH, एक कुशल JIT बिलकुल अलग चीज है।
SK-तर्क

21

इस प्रश्न के साथ एक सामान्य समस्या है कि यह बहुत निरपेक्ष है। यह वास्तव में कहने का कोई मतलब नहीं है "भाषा X भाषा Y से तेज है"। एक कंप्यूटर भाषा स्वयं "तेज़" या "धीमी" नहीं है क्योंकि यह केवल एक एल्गोरिथ्म को व्यक्त करने का तरीका है। वास्तविक प्रश्न "किसी विशेष समस्या डोमेन के लिए भाषा Y के कार्यान्वयन Y1 की तुलना में भाषा X का कार्यान्वयन X1 तेजी से क्यों है" के आदेश पर कुछ होना चाहिए?

कुछ गति अंतर निश्चित रूप से भाषा से बाहर गिरने वाले हैं क्योंकि कुछ भाषाएं कुछ डोमेन को दूसरों की तुलना में लागू करना आसान हैं। लेकिन कार्यान्वयन में तेजी लाने वाली अधिकांश भाषा नहीं है। उदाहरण के लिए, आप वास्तव में यह नहीं कह सकते हैं कि "पायथन जावा की तुलना में धीमा है" यह विचार किए बिना कि क्या आप सीपीथॉन, आयरनपिथॉन या PyPy के बारे में बात कर रहे हैं। यह उन भाषाओं के लिए विशेष रूप से सच है जो VM का उपयोग करते हैं क्योंकि गति सीधे VM की गुणवत्ता से प्रभावित होने वाली है।

एक तरफ, मैं एक ऐसी प्रणाली के साथ काम करता हूं जो विभिन्न कारणों से हमारे डिवाइस पर जेआईटी का उपयोग एक बहुत लोकप्रिय जावास्क्रिप्ट वीएम के साथ नहीं कर सकती है जो सामान्य रूप से इसका समर्थन करती है। इसका मतलब है कि हमारा जावास्क्रिप्ट एक समान प्रोसेसर के साथ पीसी पर दूर, बहुत धीमा चलता है। वह एक परिवर्तन, जो सीधे भाषा से ही संबंधित नहीं है, जावास्क्रिप्ट को "सी ++ की तुलना में कुछ गुना धीमा" होने के कारण "सी ++ की तुलना में परिमाण धीमे के आदेश" के रूप में लेता है।

यह भी विचार करें कि भाषाएँ प्रदर्शन विशेषताओं में भिन्न होती हैं जो सीधे तुलना नहीं होती हैं। बहुत सारे मानक केवल भाषा ए से भाषा बी तक एक कार्यक्रम का अनुवाद करते हैं और इस बात का ध्यान नहीं रखते हैं कि भाषाएं उन विशेषताओं में भिन्न हैं जो तेजी से होती हैं। (आप इसे किसी भी उचित बेंचमार्क तुलना में देख सकते हैं, जैसे कि आप उनसे लिंक करते हैं क्योंकि उनके पास अक्सर "फ़ू-टू-सो-थिंग और मुझे भाषा फू में इसे लागू करने का तरीका दिखाने के लिए धन्यवाद जैसे नोट होते हैं।"

उदाहरण के लिए, यह जावा कोड लें:

for(int i=0;i<10;i++) {
    Object o = new Object;
    doSomething(o);
}

यह C ++ में इसे "रीराइट" करना लुभाएगा और रन टाइम की तुलना करेगा:

for(int i=0;i<10;i++) {
    Object *o = new Object;
    doSomething(o);
    delete(o);
}

बात यह है, किसी भी सक्षम C ++ प्रोग्रामर को तुरंत दिखाई देगा कि C ++ में, यह कुछ करने का सबसे तेज़ तरीका नहीं है। आप चीजों को आसानी से बदलकर C ++ के लिए अधिक उपयुक्त बना सकते हैं:

for(int i=0;i<10;i++) {
    Object o;
    doSomething(&o);
}

मुद्दा यह नहीं है कि सी ++ तेज हो सकता है, बल्कि भाषाओं की तुलना करने के लिए बेंचमार्क लिखने के बजाय वास्तव में, वास्तव में कठिन है। इसे उचित रूप से करने के लिए, आपको दोनों भाषाओं का विशेषज्ञ होना चाहिए, और दोनों भाषाओं में स्क्रैच से लिखना होगा। फिर भी, आप आसानी से उन क्षेत्रों में भाग सकते हैं जहां एक भाषा किसी विशेष कार्य में उत्कृष्टता प्राप्त करती है। उदाहरण के लिए, मैं C ++ में हनोई के टावर्स का एक संस्करण लिख सकता हूं जो किसी भी उचित संकलक पर जावा की तुलना में तेजी से चलेगा। मैं यह कर सकता हूं कि अनिवार्य रूप से धोखा देकर, C ++ टेम्पलेट्स का उपयोग करके, संकलन समय पर मूल्यांकन किया गया (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-use-templates-424148.html)

वह बिंदु यह नहीं है कि मैं यह कह सकता था कि "C ++ जावा की तुलना में तेज़ है" क्योंकि मेरा प्रोग्राम तुरंत वापस आ गया जबकि जावा संस्करण मिनटों के लिए चला गया (और उम्मीद है कि किसी ने भी देखा कि मेरे कार्यक्रम को बनाने में आधा घंटा नहीं लगा।) मुद्दा यह है कि इसके लिए। अलग-अलग संकीर्ण मामले, C ++ तेज है। अन्य संकीर्ण मामलों के लिए यह चारों ओर का दूसरा रास्ता हो सकता है। तो यह "C ++ अधिक तेज़ नहीं है", यह "C ++ ऐसे उदाहरणों में तेज़ है जहाँ आप समय के निर्माण के दौरान अभिव्यक्ति का मूल्यांकन कर सकते हैं।" कम संतोषजनक, लेकिन सच है।

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

और यह मत भूलो कि अच्छे प्रोग्रामर खराब प्रोग्रामर की तुलना में तेजी से कोड का उत्पादन करने जा रहे हैं, अक्सर एक हद तक यह काफी भिन्नता है भाषा के मतभेद।


6

यह संकलक की गुणवत्ता के साथ करना है, जावा के संकलक को लगातार लंबे समय तक अनुकूलित किया गया है, और अनुकूलन अधिक महत्वपूर्ण है क्योंकि सभी कोड जावा के लिए संकलित हैं। मुझे यकीन नहीं है कि अजगर की तुलना में अजगर के तेज होने का सटीक कारण है, लेकिन मैं इसे पायथन के साथ Google के प्रभाव के कारण दांव लगाऊंगा।


8
इसे क्यों ठुकरा दिया गया? यह बिल्कुल जवाब है: प्रदर्शन विशुद्ध रूप से है से अनुसंधान और इंजीनियरिंग के प्रयास का विषय है, और इस प्रकार अंततः पैसा है। जो कंपनियाँ जावा कार्यान्वयन का उत्पादन करती हैं, वे पायथन या पीएचपी कार्यान्वयन का उत्पादन करने वालों की तुलना में अधिक समृद्ध होती हैं। बस इतना ही।
जोर्ग डब्ल्यू मित्तग

1
इसके अलावा, मुझे पूरा यकीन है कि सीपीथॉन अनुकूलन को स्वीकार नहीं किया जाता है अगर वे कोड को पढ़ने के लिए बहुत कठिन बनाते हैं और केवल बहुत कम प्रदर्शन बढ़ाते हैं।
cgt

2
+ जोर्ग डब्ल्यू मित्तग: मैं असहमत हूं। कुछ भाषा सुविधाओं को प्रदर्शन को लागू करने के लिए बहुत मुश्किल हो सकता है, इसलिए वे एक कुशल कार्यान्वयन के निर्माण को बहुत मुश्किल या असंभव के बगल में बनाते हैं। दूसरी ओर, "असेंबलर" भाषा का "कुशल" कार्यान्वयन बनाने के लिए यह बहुत आसान है।
user281377

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

1
@DonalFellows बिल्कुल मेरे विचार। कम संकलन समय पर जाना जाता है, अधिक समय के दौरान पता लगाना होगा।
user281377

4

क्यों जावा सबसे तेज है:

स्टेटिक रूप से टाइप किया हुआ + JIT कंपाइलिंग कोड को आक्रामक रूप से फिर से इकट्ठा करने के लिए + -server ध्वज संकलित करें।

क्यों अजगर PHP की तुलना में तेज है:

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

क्यों PHP बेकार है:

यह मूल रूप से सर्वर पर जावास्क्रिप्ट है (कोई मल्टीथ्रेडिंग समर्थन, पूरी तरह से गतिशील, शिथिल टाइप)।

संक्षेप में, जितना अधिक कंपाइलर आपके कोड के बारे में जानता है, उतना ही यह अनुकूलन कर सकता है। जावा चलने से पहले पूरी तरह से अनुकूलन योग्य है, और जब यह चल रहा है। अजगर चल रहा है, और PHP अच्छी तरह से भयानक है, जब अनुकूलन है। फेसबुक वास्तव में सर्वर पर आने से पहले ही उनके PHP को C में ट्रांसपाइल्स कर देता है।
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/


वास्तव में सर्वर पर जावास्क्रिप्ट Node.JS है और जो मुझे समझ में आता है (हालांकि मैं इसे नहीं बताऊंगा) सामान्य रूप से V8 इंजन आउटपरफॉर्मर PHP (हालांकि शायद एक टन से नहीं)। आगे आपको उल्लेख करना चाहिए कि पायथन को मूल रूप से संकलित किया जा सकता है (जावा की तुलना में यह कैसा प्रदर्शन करता है?)
जिमी होफा

मैंने वहां आपकी मदद करने के लिए व्यापक रूप से अजगर का इस्तेमाल नहीं किया है, लेकिन मैं कह सकता हूं कि वी 8 को चलाने वाले नोडज को मूल सी एक्सटेंशन के लिए समर्थन है (हालांकि जेएस / सी सीमा को पार करना बहुत धीमा है), और इसके अलावा यह Google के जेआईटी कंपाइलर का लाभ ले सकता है। .. मुझे आश्चर्य नहीं होगा अगर नोड अजगर और php दोनों से तेज है। यहाँ एक बेंचमार्क है (सबसे अधिक त्रुटिपूर्ण हैं) blog.famzah.net/2010/07/01// ध्यान दें कि जावा जेएस की तुलना में धीमा दिखता है जब तक कि कोई टिप्पणीकर्ता बेंचमार्क में हमारी खामियों को इंगित नहीं करता है ... इसलिए, इसे एक अनाज के साथ लें नमक। :)
अजाक्स

उस ने कहा, नोड और php भी दोनों एकलथ्रेडेड हैं, और जब तक आप क्लस्टर प्रॉक्सि (हैप्रोक्सी की तरह) सेट करना पसंद नहीं करते हैं, तब तक मैं दोनों को गंभीर उत्पादन वातावरण में नहीं छूता।
अजाक्स

1

बेंचमार्क बल्कि भारी गणितीय प्रोग्रामिंग के पक्ष में तिरछे होते हैं।

यह आश्चर्य की बात नहीं है कि पायथन जटिल गणित में बहुत अच्छा है यदि आप इस पर विचार करते हैं कि यह पहली बार कहाँ और क्यों लिखा गया था

दूसरी ओर PHP को वेब पृष्ठों की सेवा करने के लिए लिखा गया था, यह अन्य काम कर सकता है लेकिन वेब पेज इस कार्य में जावा से बेहतर या बेहतर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.