Суммирование большого списка чисел происходит слишком медленно
Задача: "Суммируйте первые 15 000 000 четных чисел. "
Haskell:
nats = [1..] :: [Int]
evens = filter even nats :: [Int]
MySum:: Int
MySum= sum $ take 15000000 evens
...ноMySum
занимает много времени. Точнее, примерно в 10-20 раз медленнее, чем C / C ++.
Много раз ямы обнаружили, что решение на Haskell, закодированное естественным образом, примерно в 10 раз медленнее, чем C. Я ожидал, что GHC был очень аккуратно оптимизирующим компилятором и такой задачей, как этакажется, что это сложно.
Таким образом, можно ожидать, что примерно в 1,5-2 раза медленнее, чем C. В чем проблема?
Это может быть решено лучше?
Это код C, который ям, сравнивая это с:
long long sum = 0;
int n = 0, i = 1;
for (;;) {
if (i % 2 == 0) {
sum += i;
n++;
}
if (n == 15000000)
break;
i++;
}
Редактировать 1Я действительно знаю, что это может быть вычислено в O (1). Пожалуйста, сопротивляйся.
Редактировать 2: Я действительно знаю, что вечера[2,4..]
но функцияeven
может быть что-то ещеO(1)
и должны быть реализованы как функция.