2014-11-03 15 views
10

Tôi có một câu hỏi về hiệu quả của việc hiểu thấu trong scala.Hiệu suất của việc hiểu thấu trong scala

mã sau này mất khoảng 45 giây để chạy khi perm là danh sách khoảng 550 yếu tố

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} 

Khi tôi đã thay đổi đoạn mã sau vào sau, nó chạy trong 3 giây với cùng một danh sách perm

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

Sự khác biệt về hiệu suất có liên quan gì đến việc đánh giá lười biếng ở Scala không?

Trả lời

10

Hãy desugar cho cả-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 
    } 
    } 
} 

Trong trường hợp đầu tiên, cả hai chức năng đắt tiền sẽ được thực hiện mỗi lần. Trong trường hợp thứ hai, khi somefunction(perm) trả về kết quả trống, somefunction1(perm) sẽ không bao giờ được thực hiện.

+0

Cảm ơn câu trả lời. Tôi thấy điểm của bạn. Tôi có một câu hỏi tiếp theo về quá trình khử đường. Tại sao câu lệnh đầu tiên được viết là 'perms.withFilter (_. Size> 0) .flatMap {}' và không phải 'perms.withFilter (_. Size> 0) .foreach {}'? – Piyush

+1

'foreach' trả về' Đơn vị', do đó kết quả của bạn sẽ bị mất. – drexin

+0

Ah, tôi hiểu rồi. Vì vậy, sau đây sẽ cho hiểu biết 'cho {x <- x1, y <-y1, z <-z1} năng suất (x ::: y ::: z)' dịch sang 'x1.flatmap {x => y1. flatmap {y => z1.map {z => x :: y :: z}}} '? – Piyush

0

Trong đoạn đầu tiên của bạn, có vẻ như bạn đang "lặp" qua mọi mục bạn có trong danh sách của mình với mọi mục trong danh sách từ; Trong thực tế, một sản phẩm Descartes.

Tuy nhiên, trong đoạn thứ hai của bạn, bạn chỉ "lặp" mọi mục trong perm bằng một "từ". Vì vậy, tôi cho rằng sẽ nhanh hơn rất nhiều?

Tôi dường như không thể phát hiện ra các loại biến số đầy đủ của bạn, do đó rất khó để có thể giải thích đầy đủ.

+0

danh sách từ là danh sách các chuỗi, senetenceList là danh sách các chuỗi. – Piyush

Các vấn đề liên quan