Size: a a a

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

2021 February 10

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
а так, есть же survey, там статистика
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dos
1 или 2 или 3 или ваш вариант?
кстати, самый быстрый вариант у меня получился с трасдьюсерным dedupe
(let [x 4 path [1 2 3]]
   (into [] (dedupe) (conj path x)))

заодно убирает другие дубликаты из path, если они там почему-то были
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
кстати, самый быстрый вариант у меня получился с трасдьюсерным dedupe
(let [x 4 path [1 2 3]]
   (into [] (dedupe) (conj path x)))

заодно убирает другие дубликаты из path, если они там почему-то были
сорри, не самый быстрый, а в сравнении с вариантом 2
который я тестировал как
  (let [x 4 path [1 2 3]]
   (cond-> path (nil? (some (partial = x) path)) (conj x)))

ибо #{x} не самый шустрый вариант
источник

D

Dos in Clojure — русскоговорящее сообщество
Sergey Trofimov
кстати, самый быстрый вариант у меня получился с трасдьюсерным dedupe
(let [x 4 path [1 2 3]]
   (into [] (dedupe) (conj path x)))

заодно убирает другие дубликаты из path, если они там почему-то были
👍
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
точнее
  (let [x 4 path [1 2 3]]
   (cond-> path (nil? (some #(== x %) path)) (conj x)))
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Sergey Trofimov
сорри, не самый быстрый, а в сравнении с вариантом 2
который я тестировал как
  (let [x 4 path [1 2 3]]
   (cond-> path (nil? (some (partial = x) path)) (conj x)))

ибо #{x} не самый шустрый вариант
на бо́льших случайных (rand-int) списках этот вариант не меняется почти по времени, dedupe адово тормозит
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
на бо́льших случайных (rand-int) списках этот вариант не меняется почти по времени, dedupe адово тормозит
у меня не тормозит
особенно, если сравнивать с другими предложенными решениями
также дедуп ленивый, если начать говорить о больших списках
как я сказал, сама постановка задачи у меня вызывает сомнения
источник

DL

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

ИФ

Иван Федоров... in Clojure — русскоговорящее сообщество
А кто-то видел, кстати какую-то таблицу с бенчем разных функ?
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Sergey Trofimov
у меня не тормозит
особенно, если сравнивать с другими предложенными решениями
также дедуп ленивый, если начать говорить о больших списках
как я сказал, сама постановка задачи у меня вызывает сомнения
(let [path (take 1000000 (repeatedly #(rand-int 100)))
     x (rand-int 100)
     a (time (cond-> path
               (nil? (some (partial = x) path)) (conj x)))      
     
     b (time (into [] (dedupe) (conj path x)))])

я наколенно так проверял (меняя аргумент в take)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
(let [path (take 1000000 (repeatedly #(rand-int 100)))
     x (rand-int 100)
     a (time (cond-> path
               (nil? (some (partial = x) path)) (conj x)))      
     
     b (time (into [] (dedupe) (conj path x)))])

я наколенно так проверял (меняя аргумент в take)
у тебя a ленивое и не реализуется, как я понимаю
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
(let [path (take 1000000 (repeatedly #(rand-int 100)))
     x (rand-int 100)
     a (time (cond-> path
               (nil? (some (partial = x) path)) (conj x)))      
     
     b (time (into [] (dedupe) (conj path x)))])

я наколенно так проверял (меняя аргумент в take)
ты же в а не вектор получаешь
источник

DL

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

D

Dos in Clojure — русскоговорящее сообщество
Sergey Trofimov
у меня не тормозит
особенно, если сравнивать с другими предложенными решениями
также дедуп ленивый, если начать говорить о больших списках
как я сказал, сама постановка задачи у меня вызывает сомнения
Пытался сделать dfs
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
тогда dedupe в два-три раза примерно быстрее
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
тогда dedupe в два-три раза примерно быстрее
тут уже зависеть будет от набора данных
ибо если в данных первым элементом стоит искомый, то тут уже никакой вариант с обходом по всей коллекции не сравнится
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Sergey Trofimov
тут уже зависеть будет от набора данных
ибо если в данных первым элементом стоит искомый, то тут уже никакой вариант с обходом по всей коллекции не сравнится
ну я про рандом, в среднем 2-3 раза выходит в большинстве случаев
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
тут уже зависеть будет от набора данных
ибо если в данных первым элементом стоит искомый, то тут уже никакой вариант с обходом по всей коллекции не сравнится
а вот если взять заведомо отсутствующий элемент в качестве x... 😊
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
мы так и не узнали кейс, да
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
а вот если взять заведомо отсутствующий элемент в качестве x... 😊
то дедупе будет быстрее 😊
(let [path (into [] (take 1000000 (repeatedly #(rand-int 100))))
       x 101
       a (time (cond-> path
                 (nil? (some #(== x %) path)) (conj x)))

       b (time (into [] (dedupe) (conj path x)))])
"Elapsed time: 62.1621 msecs"
"Elapsed time: 43.835101 msecs"
источник