Size: a a a

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

2020 January 24

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
эхх....
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
а ещё first и rest от range
(rest (range 10))
— 50+ns
(rest '(0 1 2 3 4 5 6 7 8 9)) на порядок быстрее, чем `(rest (range 10))`

надо попробовать свой range написать
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey Ivanov
эхх....
ага, range без параметров даёт неправильный range, через iterate

вот такой вариант работает быстрее первоначального lazy-seq
(defn x--i+i-range
 []
 (->>
   (range 10000)
   (map (fn [^long x]
          (quot (* x (inc x)) 2)))))
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
вот уж где не ожидал подставы от рэнджа. но хоть сейчас то все стало как надо
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey Ivanov
вот уж где не ожидал подставы от рэнджа. но хоть сейчас то все стало как надо
ну, решение теперь не бесконечное получилось
источник

ST

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

вот такой вариант работает быстрее первоначального lazy-seq
(defn x--i+i-range
 []
 (->>
   (range 10000)
   (map (fn [^long x]
          (quot (* x (inc x)) 2)))))
и вот тогда трансдьюсерный вариант в 2-3 раза медленнее 😊
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
с учетом переполнения лонгов бесконечное. а если в длинную арифметику переходить, то надо еще рэндж проверить на это
источник

ST

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

ST

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

ST

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

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
я тут подумал, что надо мне прочекать все места в критичных к производительности кусках где я его так использовал.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
а iterate на яве написан 😊
самопальный iterate на лезисеках всё-равно медленнее
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Borisov
Посмотрю, как от багфикса оторвусь)
не смотрел ещё?
источник

AG

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

AG

Alexey Golda in Clojure — русскоговорящее сообщество
Занят человек, фиксит, вторые сутки пошли...
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Sergey Trofimov
не смотрел ещё?
У меня открыта вкладка, прочитаю может сегодня)
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Баг и правда злой
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Andrey Ivanov
ЗЫ а вообще в энциклопедии юных сурков (СИКП) есть отдельная глава про потоки, где помимо всего прочего представлена функция возвращающая поток частичных сумм любого потока. Разумеется тоже без костылей мутабельности
А ссылку не можешь дать?
источник

AI

Andrey Ivanov in Clojure — русскоговорящее сообщество
Упражнение 3.55.

Определите процедуру partial-sums, которая в качестве аргумента берет поток S, а возвращает поток, элементы которого равны S0, S0 + S1, S0 + S1 + S2, . . .. Например, (partial-sums integers) должно давать поток 1, 3, 6, 10, 15 . . .
источник

KC

Kirill Chernyshov in Clojure — русскоговорящее сообщество
вот еще вариант

(def foo `(0 1 ~@(lazy-seq (map #(%1 %2) (map #(partial + % ) (drop 2 (range))) (drop 1 foo)))))

(take 10 foo) ;; => (0 1 3 6 10 15 21 28 36 45)
источник