performance - Haskell 中的埃拉托斯特尼筛法执行时间

标签 performance haskell functional-programming execution-time sieve-of-eratosthenes

我是 Haskell 的新手,正在编写使用列表解决埃拉托斯特尼筛问题的代码。这是代码

primes m = 2 : primes' m [3,5 ..m] [] where
primes' m integers@(p : xs) acc   | p*p>m =  reverse acc ++ integers
                                  | True  = primes' m (xs `remove` [p*p, p*p+2*p..m]) (p:acc)

remove integers@(x:xs) multiples@(y:ys) | x < y = x : remove xs multiples
                                        | x == y =    remove xs ys
                                        | x > y =     remove integers ys

remove integers multiples = integers

如果我输入 m = 2000000,代码大约需要 14 秒才能打印出所有结果。我认为 90% 的时间都花在了打印上,而不是实际执行代码。有没有办法找到这个特定程序的正确执行时间?

最佳答案

尝试一下

main = print $ last $ primes 2000000

所以它只会显示最后找到的素数。

使用-O2编译它并使用+RTS -s运行以查看总体计时和内存统计信息。

一定要在几个尺寸点进行测量,找出empirical orders of growth !真正的筛子运行速度约为 ~ n^1.1,产生 n 个素数。 ~ n^1.5 以内的任何内容都是可以的。 ~ n^2 很糟糕,比这更慢的就更糟糕了。 :)

从外观上看,你的应该没问题。

关于performance - Haskell 中的埃拉托斯特尼筛法执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50952633/

相关文章:

java - Java 7 中的函数式编程

java - 当定义的对象已存在于 map 中时,从我的 map 获取 null 返回值?

haskell - 这个片段如何翻译成 Haskell?

python - 使用pythons oursql在mysql数据库中存储数据就是爬取。为什么?

sql - SAS Proc SQL 合并时是否使用索引

haskell - Haskell 可以评估列表中的随机索引而不是垃圾收集吗?

haskell - Yesod 将 getCurrentRoute 与具有动态参数的路由进行比较

python - 为什么减法比 Python 中的加法快?

c++ - 快速访问矩阵

haskell - Control.Lens.Plated 和 Bound 交互中的空间泄漏/Bug