2012-01-03 10 views
5

A Nierzadko wzorca problemów Euler projektu wydaje się być czymś, co odpowiada:emulacji Scala ParStream

Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_) 

gdzie f jest pewną funkcję drogi-to-obliczeniowej, która zwraca wartości dodatnie aż do jakiegoś nieznanego punktu, a zwraca zera po tym.

Ja lubię porównywać rzeczy, zwłaszcza gdy równoległe kolekcje Scali i .par czynią to tak łatwo. Jednak w przypadku braku ParStream, najlepsze jakie wymyślić to:

val BATCH=1024 
Stream.from(1,BATCH).flatMap(
    i=>(i until i+BATCH).par.map(f) 
).takeWhile((_>0)).foldLeft(0L)(_+_) 

który nie wydaje się bardzo elegancko i jest wrażliwy na wybór BATCH wartości (ale mogą przynieść poprawę prędkości x4 na mój czterordzeniowy).

Wszelkie sugestie dotyczące czystszych sposobów osiągnięcia tego samego rezultatu?

+1

Podane przykłady nie są równoważne: na przykład z 'val f = 15 - (_: Int)' i 'BATCH = 10' pierwszy daje 105, a drugi 95 –

+0

@Luigi: Właśnie dlatego go zakwalifikowałem z "zwraca wartości dodatnie do ... i zwraca zera po tym". np. Działa z def f (x) = 0 max (15-x). – timday

Odpowiedz

5

Cóż, można zrobić to nieco bardziej eleganckie z czymś Stream from 1 grouped BATCH map (_.par), choć wolałbym użyć Iterator w tym przypadku - o wiele lżejsze niż Stream i nie zapełni się pamięć rEPL jako eksperymentować z to.

+0

Dzięki; Nie zauważyłem wcześniej zgrupowanej metody! – timday

Powiązane problemy