История изменений
Исправление Nervous, (текущая версия) :
Когда пытаюсь тут что-то пооптимизировать, результат обычно только ухудшается
Единственное, что пока более-менее помогло — это трансдьюсеры для разбора строк вместо threading macros (процентов на 15-20, с 20 мин до 17):
;; using transducers
(def line->measurement
"Transforms a reducing function to coerce its input values from
strings to measurements (vectors of a station name and a
floating-point value)."
(comp
(map #(s/split % scsv-split-regex))
(map #(update % 1 parse-double))))
(defn transducing-stats
"Returns the map of station stats keyed by station names, obtained by
transducing (reducing with transformation of the reducing function)
the sequence of lines."
[lines]
(transduce line->measurement update-total-stats lines))
(comment
;; 10^6 lines: ~1 sec
(time (format-stats (transducing-stats (read-file "dev/resources/measurements1M.txt"))))
;; 10^9 lines: ~1000 sec (~17 min)
(time (format-stats (transducing-stats (read-file "dev/resources/measurements.txt"))))
)
Кстати, на этой задаче можно реально ощутить разницу в производительности между компилируемой кложей и интерпретируемой бабашкой — 5-8 раз не в пользу бабашки.
Исправление Nervous, :
Когда пытаюсь тут что-то пооптимизировать, результат обычно только ухудшается
Единственное, что пока более-менее помогло — это трансдьюсеры для разбора строк вместо threading macros (процентов на 15-20, с 20 мин до 17):
;; using transducers
(def line->measurement
"Transforms a reducing function to coerce its input values from
strings to measurements (vectors of a station name and a
floating-point value)."
(comp
(map #(s/split % scsv-split-regex))
(map #(update % 1 parse-double))))
(defn transducing-stats
"Returns the map of station stats keyed by station names, obtained by
transducing (reducing with transformation of the reducing function)
the sequence of lines."
[lines]
(transduce line->measurement update-total-stats lines))
(comment
;; 10^6 lines: ~1 sec
(time (format-stats (transducing-stats (read-file "dev/resources/measurements1M.txt"))))
;; 10^9 lines: ~1000 sec (~17 min)
(time (format-stats (transducing-stats (read-file "dev/resources/measurements.txt"))))
)
Кстати, на этой задаче можно ощутить разницу в производительности между компилируемой кложей и интерпретируемой бабашкой — 5-8 раз не в пользу бабашки.
Исправление Nervous, :
Когда пытаюсь тут что-то пооптимизировать, результат обычно только ухудшается
Единственное, что пока более-менее помогло — это трансдьюсеры для разбора строк вместо threading macros (процентов на 15-20, с 20 мин до 17):
;; using transducers
(def line->measurement
"Transforms a reducing function to coerce its input values from
strings to measurements (vectors of a station name and a
floating-point value)."
(comp
(map #(s/split % scsv-split-regex))
(map #(update % 1 parse-double))))
(defn transducing-stats
"Returns the map of station stats keyed by station names, obtained by
transducing (reducing with transformation of the reducing function)
the sequence of lines."
[lines]
(transduce line->measurement update-total-stats lines))
(comment
;; 10^6 lines: ~1 sec
(time (format-stats (transducing-stats (read-file "dev/resources/measurements1M.txt"))))
;; 10^9 lines: ~1000 sec (~17 min)
(time (format-stats (transducing-stats (read-file "dev/resources/measurements.txt"))))
)
Исходная версия Nervous, :
Когда пытаюсь тут что-то пооптимизировать, результат обычно только ухудшается
Единственное, что пока более-менее помогло, это трансдьюсеры для разбора строк вместо threading macros (процентов на 15-20, с 20 мин до 17):
;; using transducers
(def line->measurement
"Transforms a reducing function to coerce its input values from
strings to measurements (vectors of a station name and a
floating-point value)."
(comp
(map #(s/split % scsv-split-regex))
(map #(update % 1 parse-double))))
(defn transducing-stats
"Returns the map of station stats keyed by station names, obtained by
transducing (reducing with transformation of the reducing function)
the sequence of lines."
[lines]
(transduce line->measurement update-total-stats lines))
(comment
;; 10^6 lines: ~1 sec
(time (format-stats (transducing-stats (read-file "dev/resources/measurements1M.txt"))))
;; 10^9 lines: ~1000 sec (~17 min)
(time (format-stats (transducing-stats (read-file "dev/resources/measurements.txt"))))
)