2014-11-03 2 views
10

में समझ के लिए प्रदर्शन का प्रदर्शन मुझे स्कैला में समझने की दक्षता के बारे में एक प्रश्न है।स्कैला

यह निम्नलिखित कोड जब पर्म लगभग 550 तत्वों

perm = some list 
for{ 
    perm <- perms.withFilter(_.size > 0) 
    wordList = somefunction(perm) //expensive operation, wordlist is a list of strings 
    sentenceList = somefunction1(perm) //very expensive operation, sentenceList is a list of list of strings 
    word <- wordList 
    sentence <- sentenceList 
} yield { word::sentence} 

जब मैं निम्नलिखित में निम्न कोड बदल की एक सूची है चलाने के लिए लगभग 45 सेकंड लेता है, यह एक ही पर्म सूची

साथ 3 सेकंड में भाग गया
perm = some list 
for{ 
    perm <- perms.withFilter(_.size > 0) 
    word <- somefunction(perm) //expensive operation 
    sentence <- somefunction1(perm) //very expensive operation 
} yield { word::sentence} 

क्या प्रदर्शन में अंतर स्कैला में आलसी मूल्यांकन के साथ कुछ करने के लिए है?

उत्तर

10

आइए desugar दोनों-comprehensions के लिए:

1.)

perms.withFilter(_.size > 0).flatMap { perm => 
    val wordList = somefunction(perm) //expensive operation 
    val sentenceList = somefunction1(perm) //very expensive operation 
    wordList.flatMap { word => 
    sentenceList.map { sentence => 
     word::sentence 
    } 
    } 
} 

2.)

perms.withFilter(_.size > 0).flatMap { perm => 
    somefunction(perm).flatMap { word => 
    somefunction1(perm).map { sentence => 
     word :: sentence 
    } 
    } 
} 

पहले मामले में, दोनों महंगा कार्यों हर बार निष्पादित किया जाएगा। दूसरे मामले में, जब somefunction(perm) एक खाली परिणाम देता है, somefunction1(perm) कभी निष्पादित नहीं किया जाएगा।

+0

उत्तर के लिए धन्यवाद। में तुम्हारी बात समझ रहा हूँ। मेरे पास डी-शर्करा प्रक्रिया के बारे में एक फॉलो अप प्रश्न है। 'Perms.withFilter (_। आकार> 0) .flatMap {} 'और नहीं' perms.withFilter (_। Size> 0) .foreach {}' के रूप में लिखा गया पहला कथन क्यों है? – Piyush

+1

'foreach' रिटर्न' यूनिट', तो आपका परिणाम खो जाएगा। – drexin

+0

आह, मैं देखता हूं। तो {x <- x1, y <-y1, z <-z1} उपज (x ::: y ::: z) के लिए निम्नलिखित समझ के लिए 'x1.flatmap {x => y1' अनुवाद करें। flatmap {y => z1.map {z => x :: y :: z}}} '? – Piyush

0

आपके पहले स्निपेट में, ऐसा लगता है कि आप अपनी शब्द सूची में प्रत्येक आइटम के साथ अपने अनुमति में मौजूद प्रत्येक आइटम के माध्यम से "लूपिंग" कर रहे हैं; असल में, एक कार्टेसियन उत्पाद।

हालांकि, आपके दूसरे स्निपेट में, आप केवल "शब्द" के साथ प्रत्येक आइटम को "लूपिंग" कर रहे हैं। तो मुझे लगता है कि यह बहुत तेज होगा?

मैं आपके चर के पूर्ण प्रकारों को काम नहीं कर सकता, इसलिए यह पूरी तरह से समझाने में सक्षम होना मुश्किल है।

+0

शब्दसूची तारों की एक सूची है, अनुष्ठान सूची तारों की सूची की एक सूची है। – Piyush