Fork me on GitHub
#clojure-italy
<
2021-07-19
>
Andrea Imparato14:07:09

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?

reborg14:07:53

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 Imparato15:07:23

(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 Imparato15:07:24

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

Andrea Imparato15:07:12

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

reborg15:07:56

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 Imparato15:07:42

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

reborg15:07:52

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 Imparato15:07:24

e pure in parallelo grazie al transduce giusto?

reborg15:07:48

no, ma non mi stupirei se andasse piu’ veloce

reborg16:07:15

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