एक प्रारंभिक प्रत्यक्ष तुलना
मैं उस कोड से शुरू करूँगा जो आपके अनुवाद की तुलना में आपके पायथन कोड के साथ अधिक निकटता से जुड़ा हुआ है। मुझे लगता है कि Raku कोड जो आपके पायथन के सबसे सीधे बराबर है:
my \table = [ [ 0 for ^4000 ] for ^4000 ];
say table[3999;3999]; # 0
यह कोड एक सतर्क-मुक्त पहचानकर्ता 1 घोषित करता है । यह:
ड्रॉप्स "आकार देना" ( [4000;4000]
इन my @table[4000;4000]
)। मैंने इसे गिरा दिया क्योंकि आपका पायथन कोड ऐसा नहीं कर रहा है। शेपिंग से फायदे होते हैं लेकिन प्रदर्शन के निहितार्थ होते हैं। 2
असाइनमेंट के बजाय बाइंडिंग का उपयोग करता है । मैंने बाइंडिंग पर स्विच किया क्योंकि आपका पायथन कोड बाइंडिंग कर रहा है, असाइनमेंट नहीं। (अजगर दोनों के बीच अंतर नहीं करता है।) जबकि राकु का असाइनमेंट दृष्टिकोण मौलिक लाभ लाता है जो सामान्य कोड के लिए लायक हैं, इसमें प्रदर्शन निहितार्थ हैं। 3
यह कोड मैंने अपना जवाब शुरू कर दिया है, अभी भी धीमा है।
सबसे पहले, दिसंबर 2018 से एक Rakudo संकलक के माध्यम से चलने वाला Raku कोड, एक ही हार्डवेयर पर, जून 2019 से Python दुभाषिया का उपयोग करते हुए, आपके Python कोड से लगभग 5 गुना धीमा है। 3
दूसरा, आपके C # कोड की तुलना में Raku कोड और Python कोड दोनों धीमे हैं, जैसे। हम बेहतर कर सकते हैं ...
एक मुहावरेदार विकल्प जो एक हजार गुना तेज है
निम्नलिखित कोड विचार करने योग्य है:
my \table = [ [ 0 xx Inf ] xx Inf ];
say table[ 100_000; 100_000 ]; # 0
इस कोड के बावजूद , आपके पायथन और C # कोड में मात्र १६ मिलियन एलिमेंट में से एक १० बिलियन एलिमेंट एरे के समान है, इसे चलाने के लिए वालकॉक का समय पाइथन कोड के आधे से भी कम है, और सी # की तुलना में सिर्फ ५ गुना कम है। कोड। इससे पता चलता है कि राकोडो समान पायथन कोड के रूप में एक हजार गुना तेजी से रकु कोड चला रहा है, और सी # कोड के रूप में सौ गुना तेज है।
Raku कोड इतनी तेजी से प्रतीत होता है क्योंकि तालिका का उपयोग करके lazily आरंभ किया जा रहा है xx Inf
। 4say
लाइन चलाने पर केवल महत्वपूर्ण कार्य किया जाता है । यह 100,000 पहले आयाम सरणियों के निर्माण का कारण बनता है, और फिर 100,000 तत्वों के साथ सिर्फ 100,000 वें दूसरे आयाम सरणी को आबाद करता है, ताकि उस सरणी के अंतिम तत्व में आयोजित say
प्रदर्शित हो सके 0
।
इसे करने के लिए एक से अधिक तरीके हैं
आपके प्रश्न को अंतर्निहित एक मुद्दा यह है कि ऐसा करने का हमेशा एक से अधिक तरीका होता है। 5 यदि आप कोड के लिए खराब प्रदर्शन का सामना करते हैं, जहां गति महत्वपूर्ण है, तो इसे अलग-अलग तरीके से कोडित करना, जैसा कि मैंने किया है, नाटकीय अंतर बना सकता है। 6
(एक और बहुत अच्छा विकल्प एक एसओ सवाल पूछना है ...)
भविष्य
Raku ध्यान से अत्यधिक optimiz डिज़ाइन किया गया है में सक्षम , यानी सक्षम करने के लिए एक दिन रन बहुत तेजी को देखते हुए आने वाले वर्षों में पर्याप्त संकलक काम , जो एक राशि पर्ल 5 या अजगर 3 कर सकते हैं, सिद्धांत रूप में, कभी चलाने के लिए, जब तक कि वे एक जमीन के माध्यम से जाना संगत कंपाइलर के कार्य को फिर से डिज़ाइन और वर्षों तक करना।
पिछले 25 वर्षों में जावा के प्रदर्शन के साथ कुछ ठीक सादृश्य है। राकोडो / एनक्यूपी / एमओआरवीएम परिपक्व प्रक्रिया के बारे में आधे रास्ते हैं जो जावा स्टैक से गुजरे हैं।
फुटनोट
1 मैं लिख सकता था my $table := ...
। लेकिन फार्म की घोषणाओं पर my \foo ...
विचार करने से सिगिल्स खत्म हो जाते हैं और इसके इस्तेमाल की अनुमति दी जाती है =
, :=
जिसकी आवश्यकता एक सतर्क पहचानकर्ता के साथ होनी चाहिए। (एक बोनस के रूप में, "एक प्रकार का जहाज़ को बाहर निकालना" एक नि: शुल्क पहचानकर्ता के रूप में परिणाम देता है, जो कई भाषाओं में कोडर से परिचित है जो निश्चित रूप से पायथन और सी # को शामिल नहीं करता है।)
2 शेपिंग में एक दिन कुछ कोड के लिए तेज सरणी संचालन हो सकता है। इस बीच, जैसा कि आपके प्रश्न पर टिप्पणियों में उल्लेख किया गया है, यह वर्तमान में स्पष्ट रूप से विपरीत करता है, इसे काफी धीमा कर देता है। मुझे लगता है कि यह बड़े हिस्से में है क्योंकि हर ऐरे एक्सेस का उपयोग समय-समय पर गतिशील रूप से किया जाता है, धीरे-धीरे सबकुछ नीचे हो जाता है, और गति को बढ़ाने में मदद करने के लिए निश्चित आकार का उपयोग करने का कोई प्रयास नहीं किया गया है। इसके अलावा, जब मैंने आपके कोड के लिए तेजी से वर्कअराउंड के साथ आने की कोशिश की, तो मैं निश्चित आकार के सरणी के उपयोग से एक को खोजने में विफल रहा, क्योंकि निश्चित आकार के सरणियों पर कई ऑपरेशन वर्तमान में अनइम्प्लीमेंट किए जा रहे हैं। फिर, ये उम्मीद है कि एक दिन लागू किया जाएगा, लेकिन संभवतः किसी के लिए भी उन्हें लागू करने पर काम करने के लिए पर्याप्त दर्द बिंदु नहीं है।
3 इसे लिखने के समय, TIO जून 2019 से Python 3.7.4, और दिसंबर 2018 से Rakudo v2018.12 का उपयोग कर रहा है। Rakudo का प्रदर्शन वर्तमान में आधिकारिक Python 3 दुभाषिया की तुलना में समय के साथ काफी तेजी से सुधर रहा है, इसलिए मैं करूँगा इस उत्तर में बताए गए की तुलना में काफी कम संकरा होने के लिए, नवीनतम Rakudo और नवीनतम पायथन के बीच अंतर की उम्मीद करें, जब Rakudo धीमा है। विशेष रूप से, वर्तमान कार्य असाइनमेंट के प्रदर्शन में काफी सुधार कर रहा है।
4 xx
आलसी प्रसंस्करण के लिए चूक लेकिन कुछ भाव भाषा के शब्दार्थ या वर्तमान संकलक सीमाओं के कारण उत्सुक मूल्यांकन को मजबूर करते हैं। वर्ष पुराने v2018.12 में रकुडो, [ [ foo xx bar ] xx baz ]
आलसी बने रहने के लिए एक अभिव्यक्ति के रूप में और उत्सुकता से मूल्यांकन करने के लिए मजबूर नहीं होना चाहिए , दोनों bar
और baz
होना चाहिए Inf
। इसके विपरीत, my \table = [0 xx 100_000 for ^100_000]
का उपयोग नहीं के साथ आलसी है Inf
। (बाद वाला कोड वास्तव में 100,000 Seq
s के बजाय पहले आयाम में 100,000 s को संग्रहीत करता है Array
- say WHAT table[0]
प्रदर्शित करता Seq
है Array
- लेकिन अधिकांश कोड अंतर को स्पॉट करने में सक्षम नहीं होंगे - say table[99_999;99_999]
अभी भी प्रदर्शित करेगा 0
।)
5 कुछ लोग सोचते हैं कि यह स्वीकार करना कमजोरी है कि समस्याओं के समाधान के बारे में सोचने और कोड समाधान करने का एक से अधिक तरीका है। वास्तव में यह कम से कम तीन संबंध में एक ताकत है। सबसे पहले, सामान्य तौर पर, किसी भी गैर-तुच्छ समस्या को प्रदर्शन प्रोफ़ाइल में नाटकीय अंतर के साथ कई अलग-अलग एल्गोरिदम द्वारा हल किया जा सकता है। इस उत्तर में एक वर्ष पुराने Rakudo के साथ पहले से उपलब्ध एक दृष्टिकोण शामिल है जो कुछ परिदृश्यों में अभ्यास से एक हजार गुना अधिक तेजी से होगा। दूसरा, रकु जैसी जानबूझकर लचीली और बहु-प्रतिमान भाषा एक कोडर (या कोडर्स की टीम) को एक समाधान व्यक्त करने की अनुमति देती है जिसे वे सुरुचिपूर्ण और बनाए रखने योग्य मानते हैं, या कि बस काम हो जाता है, जो वे उसके आधार पर करते हैं।सोचना सबसे अच्छा है, न कि वह भाषा जो थोपती है। तीसरा, एक अनुकूलन कंपाइलर के रूप में राकोडो का प्रदर्शन वर्तमान में उल्लेखनीय रूप से परिवर्तनशील है। सौभाग्य से इसमें एक महान प्रोफाइलर 6 है , इसलिए कोई यह देख सकता है कि एक अड़चन कहां है, और महान लचीलापन है, इसलिए कोई वैकल्पिक कोडिंग की कोशिश कर सकता है और यह काफी तेज कोड का उत्पादन कर सकता है।
6 जब प्रदर्शन के मामले, या यदि आप प्रदर्शन के मुद्दों की जांच कर रहे हैं, तो प्रदर्शन पर Raku डॉक्टर पृष्ठ से परामर्श करें ; यह पृष्ठ Rakudo profiler के उपयोग सहित कई विकल्पों को शामिल करता है।
@grid[4000;4000]
) अजगर कोड एक आकार की सरणी का उपयोग नहीं कर रहा है और आप राकु में एक ही कोशिश करते हैं कि आपको बहुत बेहतर समय वापस मिल जाए:my @grid = [[0 xx 4000] xx 4000];
इसका मतलब है कि आपको इसके साथ उपयोग करना होगा@grid[0][0]
नहीं है@grid[0;0]
। मुझे लगता है कि यह ज्यादातर इसलिए है क्योंकि आकार की सरणियाँ अभी भी प्रगति पर हैं।