Is each slower than while in Ruby? -


निम्न दो फ़ंक्शन, जो जांचते हैं कि कोई संख्या प्रधान है:

  def prime1? (Prime_candidate) सच है अगर [1, 2] शामिल हैं शामिल हैं? प्राइम_कंडिडेट श्रेणी = 2.पॉटो (मठ.sqrt (प्राइमकाण्डिडेट)। सीसिल) .to_a i = 0 जबकि i & lt; रेंज.count गलत लौटाता है यदि प्राइम_कंडिडेट% सीमा [आई] == 0 सीमा = श्रेणी.रेग {| जे | जम्मू% श्रेणी [i] == 0} सही अंत डीईएफ़ प्राइम 2? (प्राइमाकैन्डिडेट) सही है अगर [1, 2]। शामिल करें? प्राइमकाण्डिडेट रेंज = 2.उत्त (मठ.sqrt (प्राइमकाण्डिडेट)। सीसिल) .to_a range.each do | i | वापसी गलत अगर प्राइम_कंडिडेट% i == 0 श्रेणी = श्रेणी.रेग {| जे | जम्मू% i == 0} अंत में सही अंत   

निम्न बड़े पैमाने पर परिणाम प्राप्त करते हुए बहुत बड़े प्रधान (5 915587277) के साथ परीक्षण करते हैं:

  उपयोगकर्ता सिस्टम कुल असली प्राइम 1: 2.500000 0.010000 2.510000 (2.499585) प्राइम 2: 20.700000 0.030000 20.730000 (20.717267)   

ऐसा क्यों है? ऐसा इसलिए क्योंकि दूसरे फ़ंक्शन श्रेणी में अस्वीकार द्वारा संशोधित नहीं होता है, इसलिए प्रत्येक मूल लम्बी रेंज पर चल रहा है ?

जब आप सीमा = श्रेणी .reject {..} < / कोड>, आप मूल श्रेणी को संशोधित नहीं करते हैं (जो आपको नहीं करना चाहिए, क्योंकि यह पुनरावृत्ति को गड़बड़ कर देगा - आपको अस्वीकार करने की आवश्यकता है! ऐसा करने के लिए) बल्कि एक अस्थायी सरणी जो पुनरावृत्ति के अंत में केवल पेरेंट रेंज चर को सौंपा जाता है।

प्रत्येक चलती में prime2 पूर्ण मूल रेंज पर चलता है, न कि छोटा, जो लूप समाप्त होने से पहले, केवल ब्लॉक में मौजूद होता है।

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

यदि आप अपने कोड के तर्क को बेहतर बनाते हैं तो आपको बहुत तेज़ परिणाम मिलेगा। यह सरणी हेरफेर महंगा है और इसके लिए आपको किसी सरणी की ज़रूरत नहीं है:

  def prime3? (प्राइम_कैंडिडेट) गलत लौटाएगा अगर प्राइम_कंडिडेट == 1 रिटर्न सही है अगर प्राइमकाण्डिडेट == 2 श्रेणी = 2 .. (गणित.sqrt (prime_candidate) .ceil) range.all? {| X | Prime_candidate% x! = 0} अंत #about 300Ã ?? प्रधानमंत्री के रूप में आपके उदाहरण के लिए तेज़ समय? मेरे पीसी पर    

Comments

Popular posts from this blog

php - PDO bindParam() fatal error -

logging - How can I log both the Request.InputStream and Response.OutputStream traffic in my ASP.NET MVC3 Application for specific Actions? -

java - Why my included JSP file won't get processed correctly? -