У меня есть такие функции, как:
millionsOfCombinations = [[a, b, c, d] |
a <- filter (...some filter...) someListOfAs,
b <- (...some other filter...) someListOfBs,
c <- someListOfCs, d <- someListOfDs]
aLotOfCombinationsOfCombinations = [[comb1, comb2, comb3] |
comb1 <- millionsOfCombinations,
comb2 <- millionsOfCombinations,
comb3 <- someList,
...around 10 function calls to find if
[comb1, comb2, comb3] is actually useful]
Оценка millionsOfCombinations
занимает 40 секунд.на очень быстрой рабочей станции.Оценка aLotOfCombinationsOfCombinations
!! 0 заняла 2 дня: - (
Как я могу ускорить этот код? До сих пор у меня было 2 идеи - использовать профилировщик. Пробовал запускать myapp +RTS -sstderr
после компиляции с GHC,но получить пустой экран и не хочу ждать дни, пока он не закончится.
2-я мысль была как-то кешировать millionsOfCombinations
. Правильно ли я понимаю, что для каждого значения в aLotOfCombinationsOfCombinations
, millionsOfCombinations
оценивается несколько раз? Если это так, как я могу кешировать результат? Очевидно, я только начал изучать Haskell. Я знаю, что есть способ сделать кеширование вызовов с помощью монады, но я все еще не понимаю этих вещей.