आप यहाँ काम पर दो बातें मिल गया है पाश विकल्प है। इनमें से पहला यह है कि गो को मशीन कोड में संकलित किया गया है और सीधे सीपीयू पर चलाया जाता है जबकि पायथन को बाइटकोड में एक (विशेष रूप से धीमी) वीएम के खिलाफ संकलित किया जाता है।
दूसरा, और अधिक महत्वपूर्ण, प्रभावशाली प्रभाव प्रदर्शन यह है कि दो कार्यक्रमों के अर्थशास्त्र वास्तव में काफी अलग हैं। गो संस्करण एक "बॉक्स" बनाता है जिसे "एक्स" कहा जाता है जिसमें एक संख्या और वृद्धि होती है जो प्रोग्राम के माध्यम से प्रत्येक पास 1 से होती है। पायथन संस्करण को वास्तव में प्रत्येक चक्र पर एक नया "बॉक्स" (इंट ऑब्जेक्ट) बनाना होता है (और, अंत में, उन्हें दूर फेंकना पड़ता है)। हम अपने कार्यक्रमों थोड़ा संशोधित करके इस प्रदर्शन कर सकते हैं:
package main
import (
"fmt"
)
func main() {
for i := 0; i < 10; i++ {
fmt.Printf("%d %p\n", i, &i)
}
}
... और:
x = 0;
while x < 10:
x += 1
print x, id(x)
इसका कारण यह है जाओ, की वजह से यह सी जड़ें है, एक चर नाम एक जगह का उल्लेख करने लगते हैं, जहां पाइथन चीजों के संदर्भ में परिवर्तनीय नाम लेता है। चूंकि एक पूर्णांक को अजगर में एक अद्वितीय, अपरिवर्तनीय इकाई माना जाता है, इसलिए हमें लगातार नए बनाना चाहिए। पाइथन को गो से धीमा होना चाहिए, लेकिन आपने सबसे खराब स्थिति परिदृश्य चुना है - in the Benchmarks Game, हम औसतन 25x गुना तेज (सबसे खराब मामले में 100x) देखते हैं।
आपने शायद इसे पढ़ा है, यदि आपके पायथन प्रोग्राम बहुत धीमे हैं, तो आप चीजों को सी में ले जाकर उन्हें तेज कर सकते हैं। सौभाग्य से, इस मामले में, किसी ने पहले से ही यह आपके लिए किया है। आप अपने खाली पाश तो जैसे xrange() उपयोग करने के लिए फिर से लिखने हैं:
for x in xrange(1000000000):
pass
print "Done."
... आप इसके बारे में दो बार के रूप में तेजी से चलाने देखेंगे। यदि आपको अपने कार्यक्रम में वास्तव में एक बड़ी बाधा के लिए लूप काउंटर मिलते हैं, तो समस्या हल करने के नए तरीके की जांच करने का समय हो सकता है।
मैं प्रत्येक पाश के लिए एक और चर (अर्थात i2 = i) मैं आवंटित करने के लिए पाश के लिए बदल गया है और गति अभी भी वही था (ताकि मूल रूप से मुझे पता है पाश के लिए मार डाला जाता है)। – bab
मेरे पास अंत में प्रोग्राम प्रिंट i2 था, और i2 99 99 99 999 – bab