Size: a a a

Clojure — русскоговорящее сообщество

2021 March 13

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Sergey Trofimov
но в целом отражена суть: в каждой строке добавляем по символу (в данном случае это "* ") и берём нужное число строк
по желанию печатаем

а когда я вижу все эти str/join, меня передёргивает 😊
Ну у меня просто привычный подход, который к такой тестовой задачке можно было и не применять:
собрать данные
отформатировать
вывести
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
И джойны это как раз часть форматирования
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
  (->> (iterate (partial str "* ") "* ") 
      (take 5)
      (run! println))
*
* *
* * *
* * * *
* * * * *
а можно и с трансдьюсерами, будет в два раза быстрее 😊
  (->> (iterate (partial str "* ") "* ")
      (transduce (comp (take 5)
                       (map println))
                 (constantly nil)))
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
а можно и с трансдьюсерами, будет в два раза быстрее 😊
  (->> (iterate (partial str "* ") "* ")
      (transduce (comp (take 5)
                       (map println))
                 (constantly nil)))
или хотя бы такой промежуточный по скорости вариант
  (->> (iterate (partial str "* ") "* ")
      (eduction (take 5))
      (run! println))
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Sergey Trofimov
а можно и с трансдьюсерами, будет в два раза быстрее 😊
  (->> (iterate (partial str "* ") "* ")
      (transduce (comp (take 5)
                       (map println))
                 (constantly nil)))
Ктож принтлн мапает?!
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну и всё вместе:
  (->> [\*]
      (iterate #(conj % \*))
      (take 5)
      (map #(string/join \space %))
      (string/join \newline)
      identity) #_"4,594061 µs"

 (->> (range)
      (map #(repeat % "*"))
      (map #(clojure.string/join " " %))
      (take 6)
      (clojure.string/join "\n")
      identity) #_"5,350444 µs"

 (->> (range 1 6)
      (map #(repeat % \*))
      (map #(string/join \space %))
      (string/join \newline)
      identity) #_"2,648124 µs"

 (->> (repeat 5 \*)
      (reductions conj [])
      (map #(string/join \space %))
      (string/join \newline)
      (identity)) #_"3,803863 µs"

 (->> (iterate (partial str "* ") "* ")
      (transduce (comp (take 5) (map identity))
                 (constantly nil))) #_"917,929556 ns"

 (->> (iterate (partial str "* ") "* ")
      (eduction (take 5))
      (run! identity)) #_"1,031619 µs"

 (->> (iterate (partial str "* ") "* ")
      (take 5)
      (run! identity)) #_"1,788757 µs"
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну и всё вместе:
  (->> [\*]
      (iterate #(conj % \*))
      (take 5)
      (map #(string/join \space %))
      (string/join \newline)
      identity) #_"4,594061 µs"

 (->> (range)
      (map #(repeat % "*"))
      (map #(clojure.string/join " " %))
      (take 6)
      (clojure.string/join "\n")
      identity) #_"5,350444 µs"

 (->> (range 1 6)
      (map #(repeat % \*))
      (map #(string/join \space %))
      (string/join \newline)
      identity) #_"2,648124 µs"

 (->> (repeat 5 \*)
      (reductions conj [])
      (map #(string/join \space %))
      (string/join \newline)
      (identity)) #_"3,803863 µs"

 (->> (iterate (partial str "* ") "* ")
      (transduce (comp (take 5) (map identity))
                 (constantly nil))) #_"917,929556 ns"

 (->> (iterate (partial str "* ") "* ")
      (eduction (take 5))
      (run! identity)) #_"1,031619 µs"

 (->> (iterate (partial str "* ") "* ")
      (take 5)
      (run! identity)) #_"1,788757 µs"
Попробуй на take 100500
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
Попробуй на take 100500
зачем?
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Sergey Trofimov
зачем?
Интересно поведение на больших числах, а я без камплюктера щас
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
Интересно поведение на больших числах, а я без камплюктера щас
что именно?
все варианты?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
или какой-то конкретный?
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Sergey Trofimov
что именно?
все варианты?
Ага, все, если не лень
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну, первый вариант уже на 10000 еле живой
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну, первый вариант уже на 10000 еле живой
Ну я образно сказал
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну я не знаю, что для тебя большие числа
1000 это как-то совсем уже...
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
Попробуй на take 100500
  (do (time (->> [\*]
                (iterate #(conj % \*))
                (take 10000)
                (map #(string/join \space %))
                (string/join \newline)
                identity))
     nil) #_"4202.977 msecs"

 (do (time (->> (range)
                (map #(repeat % "*"))
                (map #(clojure.string/join " " %))
                (take 10001)
                (clojure.string/join "\n")
                identity))
     nil) #_"3424.3458 msecs"
 
 (do (time (->> (range 1 10001)
                (map #(repeat % \*))
                (map #(string/join \space %))
                (string/join \newline)
                identity))
     nil) #_"3851.0738 msecs"

 (do (time (->> (repeat 10000 \*)
                (reductions conj [])
                (map #(string/join \space %))
                (string/join \newline)
                (identity)))
     nil) #_"3831.1308 msecs"

 (do (time (->> (iterate (partial str "* ") "* ")
                (transduce (comp (take 10000) (map identity))
                           (constantly nil))))
     nil) #_"34.8619 msecs"

 (do (time (->> (iterate (partial str "* ") "* ")
                (eduction (take 10000))
                (run! identity)))
     nil) #_"39.1781 msecs"

 (do (time (->> (iterate (partial str "* ") "* ")
                (take 10000)
                (run! identity)))
     nil) #_"41.9111 msecs"
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Спасибо!
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
правда time разброс даёт большой, но порядок понятен
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ну и понятно, что string/join на таких длинных строках не герой
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
то, что было медленнее в разы, стало медленнее на порядки
источник