Digamos que definir la secuencia de todos los números naturales de la siguiente manera:Clojure Mapeo paralelo y secuencias infinitas
(def naturals (iterate inc 0))
también defino una función de mapeo de los naturales a cero que toma un tiempo para calcular de este modo:
(defn hard-comp [_] (Thread/sleep 500))
Nota el tiempo de cálculo para evaulate los siguientes s-expresiones medida por clojure.core/time
.
(dorun (map hard-comp (range 30))) ;
15010,367496 mseg
(dorun (pmap hard-comp (range 30))) ;
537.044554 mseg
(dorun (map hard-comp (doall (take 30 naturals))))) ;
15009.488499 mseg
(dorun (pmap hard-comp (doall (take 30 naturals)))) ;
3004.499013 mseg
(doall (take 30 naturals)) ;
0.385724 mseg
(range 30)
; 0.159374 msecs
pmap
es ~ 6 veces más rápido cuando se lo llama con un rango explícito que con una sección de los naturales.
Dado que (= (range 30) (take 30 naturals))
devuelve verdadero y ambos objetos son del tipo clojure.lang.LazySeq
, y clojure evacua todos los argumentos a una función antes de llamar a la función, ¿cómo se pueden explicar los detalles de temporización anteriores?