埃拉托色尼筛法执行时间 haskell
Sieve of Eratosthenes execution time in haskell
我是 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
不好,比这更慢更糟。 :)
你的应该没问题,看样子。
我是 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
不好,比这更慢更糟。 :)
你的应该没问题,看样子。