Size: a a a

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

2021 October 29

KR

Kostyantin Randomnam... in Clojure — русскоговорящее сообщество
выкинь перегрузку, просто сделай внутри функции вычисление этого модифаера, тебе скорей всего будет проще понять
источник

ST

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

я, кстати, в своих проектах использую свою мемоизацию в виде надстройки над caffeine
источник

PL

Pavel Lygin in Clojure — русскоговорящее сообщество
(defn calculate-area [function x]
 (let [f (memoize (partial function x))]
   (*
     step
     (/
       (+
         (f)
         (+ (f) (function step)))
       2)
     )
   )
 )

но чуда по перфомансу не произошло
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
нет, memoize нужно делать в integral
источник

ST

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

а в целом я вообще не вижу, чтобы у тебя вызывалась функция вычисления площади с одинаковым аргументом, i у тебя монотонно возрастает
какое вычисление ты хочешь закэшировать, чтобы получить профит?
источник

PL

Pavel Lygin in Clojure — русскоговорящее сообщество
в моем представлении закешировать результат применения анонимной функции к X. Уменьшит количество вызовов (function x) с двух до одного раза
источник

ST

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

PL

Pavel Lygin in Clojure — русскоговорящее сообщество
источник

PL

Pavel Lygin in Clojure — русскоговорящее сообщество
и функцию от step тоже можно мемоизировать
источник

ИИ

Искандер Искаков... in Clojure — русскоговорящее сообщество
🤔🤔🤔
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
так записать запрещено?
(defn calculate-area [function x]
 (let [fx (function x)]
   (*
     step
     (/
       (+
         fx
         (+ fx (function step)))
       2)
     ))
 )
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
да, посчитать снаружи и передать в функцию
источник

PL

Pavel Lygin in Clojure — русскоговорящее сообщество
(defn calculate-area [function x]
 (let [f (memoize (partial function x))]
   (*
     step
     (/
       (+
         (f)
         (+ (f) (function step)))
       2)
     )
   )
 )

так почти и записал🙄
источник

ST

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

PL

Pavel Lygin in Clojure — русскоговорящее сообщество
функцию сделал сильно затратнее сейчас, ещё раз проверю
источник

А

Алексей in Clojure — русскоговорящее сообщество
а что ты хочешь мемоизировать в целом?
источник

А

Алексей in Clojure — русскоговорящее сообщество
в чем идея то?
источник

А

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

А

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

PL

Pavel Lygin in Clojure — русскоговорящее сообщество
спасибо вариант с memoize отработал на 2 секунды быстрее:
(defn calculate-area [function x]
; (let [fx (partial function x)]
 (let [fx (memoize (partial function x))]
  (*
   step
   (/
     (+
       (fx)
       (+ (fx) (function step)))
     2)
   )
  )
 )

при вызове с тред слипом:
(time (integral (fn [x] (do (Thread/sleep 100) (Math/cos (Math/sin x)))) 10))
источник