Size: a a a

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

2021 July 21

AS

Anatoly Smolyaninov in Clojure — русскоговорящее сообщество
ну разве что вот этому коню https://ru.wikipedia.org/wiki/%D0%A3%D0%BC%D0%BD%D1%8B%D0%B9_%D0%93%D0%B0%D0%BD%D1%81
а так это как минимум надо понимать как что устроено в кложе и как работает)
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
В основном причина, наверное в том, что some останавливается сразу
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Хотя, не только в этом.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Правда лучше бенчмаркнуть критериумом, а то за десять запусков разлёт очень большой.
источник

GA

Gleb Averchuk in Clojure — русскоговорящее сообщество
Так понимаю, что ленивость она не вполне тотально ленивая. Ленивая последовательность всё равно батчами процессится. и поэтому фильтр успевает применить предикат к нескольким элементам после first удовлетворяющему pred. В отличии от some, который исключает подобный перезаклад.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Ленивость по 32 элемента ленивость, вроде бы.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
filter вообще до конца должен всё реализовать.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
По смыслу.
источник

A

Andrey in Clojure — русскоговорящее сообщество
some только консьюмит ленивую последовательность, filter консьюмит и строит новую.

Насколько я понимаю, filter строит только первый чанк, следующий строится после реализации первого. Похоже просто на накладные расходы по созданию новой ленивой последовательности до первого совпадения с предикатом.
источник

ST

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

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
да, тоже заметил. Будет в 1.5 раза примерно
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Evaluation count : 4449696 in 6 samples of 741616 calls.
            Execution time mean : 134,589137 ns
   Execution time std-deviation : 13,183541 ns
  Execution time lower quantile : 125,903960 ns ( 2,5%)
  Execution time upper quantile : 156,810049 ns (97,5%)
                  Overhead used : 11,877858 ns

Found 1 outliers in 6 samples (16,6667 %)
 low-severe   1 (16,6667 %)
Variance from outliers : 30,3177 % Variance is moderately inflated by outliers

(first (filter int? [1 nil nil]))
=> 1
Evaluation count : 17882796 in 6 samples of 2980466 calls.
            Execution time mean : 21,880812 ns
   Execution time std-deviation : 2,182807 ns
  Execution time lower quantile : 20,298050 ns ( 2,5%)
  Execution time upper quantile : 25,304205 ns (97,5%)
                  Overhead used : 11,877858 ns

Found 1 outliers in 6 samples (16,6667 %)
 low-severe   1 (16,6667 %)
Variance from outliers : 30,4258 % Variance is moderately inflated by outliers

(find-first int? [1 nil nil])
=> 1
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Evaluation count : 4502946 in 6 samples of 750491 calls.
            Execution time mean : 150,081691 ns
   Execution time std-deviation : 25,992720 ns
  Execution time lower quantile : 121,161713 ns ( 2,5%)
  Execution time upper quantile : 183,691543 ns (97,5%)
                  Overhead used : 11,877858 ns

(first (filter int? [nil nil 1]))
=> 1
Evaluation count : 7285056 in 6 samples of 1214176 calls.
            Execution time mean : 69,878110 ns
   Execution time std-deviation : 5,317788 ns
  Execution time lower quantile : 65,859802 ns ( 2,5%)
  Execution time upper quantile : 78,592552 ns (97,5%)
                  Overhead used : 11,877858 ns

Found 1 outliers in 6 samples (16,6667 %)
 low-severe   1 (16,6667 %)
Variance from outliers : 15,4176 % Variance is moderately inflated by outliers

(find-first int? [nil nil 1])
=> 1
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Интересно, что если данные велики, то разница обратна.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
например, на таком векторе
(def data (vec (concat (repeat 500 nil) [1])))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
тогда first/filter быстрее x2
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Мне чисто эстетически(как более точно выражающий смысл) some нравится больше
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
а (first (filterv int? data)) в _данном_ случае будет ещё быстрее 😊
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
а у меня есть такая функция, и можно не писать find-first

(defn tested-by
 "Returns `x` if `(pred x)` is logical true, else `nil`.
  Returns #(tested-by % pred) in case of 1-arity."
 ([pred]
  #(tested-by % pred))
 ([x pred]
  (when (pred x) x)))

(some (tested-by int?) data)
источник

DL

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