2014-11-03 10 views
10

I for-comprehensions scala içinde verimliliği hakkında bir soru var.Performans için-anlama scala

Aşağıdaki kod, perma I 'izlenerek aşağıdaki kodu değiştirildi yaklaşık 550 elemanlar

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} 

listesidir çalıştırmak için yaklaşık 45 saniye sürer, aynı perma listesi

3 saniyede ran
perm = some list 
for{ 
    perm <- perms.withFilter(_.size > 0) 
    word <- somefunction(perm) //expensive operation 
    sentence <- somefunction1(perm) //very expensive operation 
} yield { word::sentence} 

Performanstaki farkın Scala'da temkinli değerlendirme ile bir ilgisi var mı? İlk snippet'inde

cevap

10

edelim desugar hem-comprehensions için:

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.) İlk durumda

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

, hem pahalı fonksiyonları her zaman çalıştırılacaktır. İkinci durumda, somefunction(perm) boş bir sonuç döndürdüğünde, somefunction1(perm) hiçbir zaman yürütülmez.

+0

Cevabınız için teşekkürler. Senin değinmek istediğin noktayı anlıyorum. Şekerleme işlemiyle ilgili bir takip sorumlum var. İlk deyim, perms.withFilter (_. Size> 0) .flatMap {} 've perms.withFilter (_. Size> 0) .foreach {}' olarak değil neden yazılır? – Piyush

+1

"foreach", "Unit" i döndürür, böylece sonuçlarınız kaybolacaktır. – drexin

+0

Ah, anlıyorum. Bu nedenle, 'xx-y1, y <-y1, z <-z1} verimi (x ::: y ::: z) için aşağıdaki anlama-anlama ları' x1.flatmap {x => y1 'e çevirir. flatmap {y => z1.map {z => x :: y :: z}}} '? – Piyush

0

, size kelime listedeki her öğesiyle perma bulunan her öğe ile "döngü" olduğunu görüyoruz; Aslında, bir Kartezyen ürünü.

Ancak, ikinci parçada yalnızca bir "kelime" ile perma her öğeyi "döngü" vardır. Öyleyse bunun çok daha hızlı olacağını var mı?

Ben tam olarak açıklamak mümkün yüzden onun oldukça zor, değişkenlerinizin tam türlerini yolculuk devam edemez.

+0

wordlist dizeleri listesidir, senetenceList dizeleri listesinin bir listesidir. – Piyush