Какие операции в параллельных коллекциях Scala распараллеливаются?

Похоже, что когда я вызываю map в параллельном списке, операция выполняется параллельно, но когда я делаю filter в этом списке, операция выполняется строго последовательно. Поэтому, чтобы сделать filter parallel, я сначала сопоставляю (A, Boolean), затем фильтрует эти кортежи и снова сопоставляю все. Это не очень удобно.

Итак, мне интересно - какие операции с параллельными коллекциями распараллелены и которые не являются?

Ответ 1

Нет параллельных списков. Вызов par на List преобразует List в неизменяемую по умолчанию параллельную последовательность - a ParVector. Это преобразование продолжается последовательно. И filter, и map должны быть параллельны.

scala> import scala.collection._
import scala.collection._

scala> List(1, 2, 3).par.filter { x => println(Thread.currentThread); x > 0 }
Thread[ForkJoinPool-1-worker-5,5,main]
Thread[ForkJoinPool-1-worker-3,5,main]
Thread[ForkJoinPool-1-worker-0,5,main]
res0: scala.collection.parallel.immutable.ParSeq[Int] = ParVector(1, 2, 3)

Возможно, вы пришли к выводу, что filter не является параллельным, потому что вы измерили время преобразования и время filter.

Некоторые операции, которые не распараллелены в настоящее время: sort* варианты, indexOfSlice.