clojure-italy

Andrea Imparato 2021-07-19T14:51:09.030600Z

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?

reborg 2021-07-19T14:56:53.030700Z

Teoricamente dovrebbe essere O(log32N) via index come dici tu, quindi non dovrebbe dipendere da un uso corretto di rand-nth. Puoi postare codice?

Andrea Imparato 2021-07-19T15:02:23.031Z

(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)

Andrea Imparato 2021-07-19T15:03:24.031200Z

la lista finale ha 8198516 elementi non qualche migliaio come ho detto prima lol

Andrea Imparato 2021-07-19T15:04:12.031400Z

con pochi elementi rand-nth ritorna subito per questo mi chiedevo perche’ con molti elementi ci mette cosi tanto 😕

reborg 2021-07-19T15:05:56.031600Z

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

Andrea Imparato 2021-07-19T15:26:51.031800Z

ah giusto!

Andrea Imparato 2021-07-19T15:32:42.032Z

ho appena fatto la prima dose di vaccino non sono tutto apposto 😄

reborg 2021-07-19T15:57:52.032200Z

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))

Andrea Imparato 2021-07-19T15:59:24.032600Z

e pure in parallelo grazie al transduce giusto?

reborg 2021-07-19T15:59:48.032800Z

no, ma non mi stupirei se andasse piu’ veloce

reborg 2021-07-19T16:01:15.033Z

comunque se hai 8M di stringhe quando arrivi in fondo, spero che ti puoi permettere di tenerle in memoria tutte assieme