2009-06-29 14 views
9

मैं एक समारोह है कि एक नंबर एन संख्या 1. मैं मुसीबत पता लगाना रखने के लिए कैसे हो रही है को छोड़कर अप करने के लिए अभाज्य संख्या का एक अनुक्रम रिटर्न है कि मैं बनाया के साथ Seq.cache उपयोग करने के लिए कोशिश कर रहा हूँ दायरे में कैश अनुक्रम लेकिन अभी भी मेरी परिभाषा में इसका उपयोग करें।एफ # का उपयोग कर अनुक्रम कैश सही ढंग से

let rec primesNot1 n = 
    {2 .. n} 
    |> Seq.filter (fun i -> 
     (primesNot1 (i/2) |> Seq.for_all (fun o -> i % o <> 0))) 
    |> Seq.append {2 .. 2} 
    |> Seq.cache 

इस बारे में कोई विचार है कि मैं इसे तेजी से बनाने के लिए Seq.cache का उपयोग कैसे कर सकता हूं? वर्तमान में यह गुंजाइश से गिरता रहता है और केवल प्रदर्शन को धीमा कर रहा है।

उत्तर

10

Seq.cache कैश IEnumerable<T> उदाहरण कैश करता है ताकि अनुक्रम में प्रत्येक आइटम केवल एक बार गणना की जा सके। आपके मामले में, हालांकि, आप अनुक्रम में एक समारोह से वापस लौटे कैशिंग रहे हैं, और हर बार जब आप फ़ंक्शन को कॉल करें यदि आप एक नई कैश्ड दृश्य है, जो आप किसी भी अच्छा काम नहीं करता मिलता है। मुझे नहीं लगता कि कैशिंग वास्तव में आपकी समस्या का सही दृष्टिकोण है क्योंकि आपने इसे रेखांकित किया है; इसके बजाय आपको शायद ज्ञापन में देखना चाहिए।

यदि n से कम प्राइम देने वाले फ़ंक्शन को परिभाषित करने के बजाय आप प्राइम के अनंत अनंत अनुक्रम को परिभाषित करना चाहते हैं, तो कैशिंग अधिक समझ में आता है। यह इस तरह दिखेगा:

let rec upFrom i = 
    seq { 
    yield i 
    yield! upFrom (i+1) 
    } 

let rec primes = 
    seq { 
    yield 2 
    yield! 
     upFrom 3 |> 
     Seq.filter (fun p -> primes |> Seq.takeWhile (fun j -> j*j <= p) |> Seq.forall (fun j -> p % j <> 0)) 
    } 
    |> Seq.cache 

मैंने आपकी तुलना में इस विधि के प्रदर्शन की तुलना नहीं की है।

+0

बहुत बढ़िया धन्यवाद, प्रदर्शन अच्छा है। – gradbot

2

मुझे पता चला कि मेरी समस्या को एक गुना के साथ कैसे हल किया जाए, लेकिन seq.cache का उपयोग करने का मेरा विचार नहीं।

let primesNot1 n = 
    {2 .. n} 
    |> Seq.fold (fun primes i -> 
     if primes |> Seq.for_all (fun o -> i % o <> 0) then 
      List.append primes [i] 
     else 
      primes) [2] 
+0

पुराने सितंबर रिलीज का उपयोग करके प्रदर्शन के साथ लगभग 3x बेहतर प्रदर्शन है। मैं आज बाद में बनाम 2010 में जांच करूंगा। – gradbot

+0

वीएस -2010 में प्रदर्शन गुना के साथ 2x बेहतर है। जानना अच्छा लगता है कि अनुक्रमों के प्रदर्शन में वृद्धि हुई थी। – gradbot

2

क्या आपने LazyList पर एक नज़र डाली है? ऐसा लगता है कि यह एक ही समस्या को हल करने के लिए डिज़ाइन किया गया है। यह पावरपैक में है।

संबंधित मुद्दे