Ho una domanda sull'efficienza delle incomprensioni in scala.Prestazioni di comprensione per scala
Questo seguente codice richiede circa 45 secondi per eseguire quando perm è un elenco di circa 550 elementi
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}
quando ho cambiato il seguente codice nel seguito, ha funzionato in 3 sec con l'elenco stesso perm
perm = some list
for{
perm <- perms.withFilter(_.size > 0)
word <- somefunction(perm) //expensive operation
sentence <- somefunction1(perm) //very expensive operation
} yield { word::sentence}
La differenza nell'esecuzione ha qualcosa a che fare con la valutazione pigra in Scala?
Grazie per la risposta. Vedo il tuo punto. Ho una domanda di follow-up sul processo di de-sugaring. Perché la prima istruzione è scritta come 'perms.withFilter (_. Size> 0) .flatMap {}' e non 'perms.withFilter (_. Size> 0). Foreach {}'? – Piyush
'foreach' restituisce' Unità', quindi il risultato sarebbe perso. – drexin
Ah, capisco. Così il seguente for-comprehensions 'for {x <- x1, y <-y1, z <-z1} yield (x ::: y ::: z)' traduce in 'x1.flatmap {x => y1. flatmap {y => z1.map {z => x :: y :: z}}}}? – Piyush