Ciao signori, domanda veloce, perché rand-nth su un vector di qualche migliaio di elementi mi va lentissimo? I vector non dovrebbero avere accesso immediato via index? Può essere che la sequenza non sia ancora tutta realizzata ed è per questo che è lento?
Teoricamente dovrebbe essere O(log32N) via index come dici tu, quindi non dovrebbe dipendere da un uso corretto di rand-nth. Puoi postare codice?
(let [chain (build-markov (load-data/generate-text-list text))
first-keys (load-data/generate-first-keys text)
sentences (apply concat (map #(sentence-by-key % chain '() true) first-keys))
result (->> (vec (reduce (fn [result value]
(if (not= "java.lang.String" (type (first value)))
(conj result (flatten value))
(conj result value)))
[]
sentences))
(remove #(= '("") %))
(pmap #(clojure.string/join " " %)))]
result)la lista finale ha 8198516 elementi non qualche migliaio come ho detto prima lol
con pochi elementi rand-nth ritorna subito per questo mi chiedevo perche’ con molti elementi ci mette cosi tanto 😕
Dunque, il risultato di un pmap e’ una lazyseq, quindi no vector. Poi occhio che (not= "java.lang.String" (type (first value)) e’ sempre vero
ah giusto!
ho appena fatto la prima dose di vaccino non sono tutto apposto 😄
Questo mi sembra a naso equivalente come logica, ma ritorna un vector:
(let [chain (build-markov (load-data/generate-text-list text))
first-keys (load-data/generate-first-keys text)
sentences (mapcat #(sentence-by-key % chain '() true) first-keys)]
(transduce
(comp
(remove #(= '("") %))
(map #(clojure.string/join " " %)))
(fn ([a b] ((if (coll? b) into conj) a b))
([] [])
([a] a)) sentences))e pure in parallelo grazie al transduce giusto?
no, ma non mi stupirei se andasse piu’ veloce
comunque se hai 8M di stringhe quando arrivi in fondo, spero che ti puoi permettere di tenerle in memoria tutte assieme