Лично я бы по-другому структурировал код. У меня есть реализация этой проблемы, которая сначала генерирует ленивый последовательность всех простых чисел, а затем суммирует первые 2 000 000 элементов. Занимает 16 секунд на clojure 1.2, но он вряд ли оптимизирован, за исключением использования recur.
Вы также делаете много ненужных сравнений с вашим входным диапазоном; (remove #(zero? (mod % (first n))) n)
проверяет всех кандидатов на наличие всех нечетных чисел, что является бессмысленным **, особенно если вы вводите его с помощью doall. На самом деле вам нужно только протестировать простое число кандидата x
со всеми известными простыми числами <= sqrt (x) и отбросить кандидата, когда вы найдете свое первое совпадение. </p>
** Я только что заметил, что ваш алгоритм не настолько глуп, но я все же рекомендую переписать ваш алгоритм, поскольку ленивый seq находит «следующее простое число», учитывая последовательность предыдущих простых чисел и число кандидатов.