鑑於編寫查找所有素數的函數的這兩種方式達到特定號碼:++,last&init快於:,head&tail?
primes1 = iterate
(\ps -> ps ++ [([x |
x <- [last ps + 1..],
all (\p -> x `mod` p /= 0) ps] !! 0)])
[2]
primesTo1 :: Integer -> [Integer]
primesTo1 n = init $ head $ dropWhile (\p -> last p <= n) primes1
primes2 = iterate
(\ps -> ([x |
x <- [head ps + 1..],
all (\p -> x `mod` p /= 0) ps] !! 0)
: ps)
[2]
primesTo2 :: Integer -> [Integer]
primesTo2 n = tail $ head $ dropWhile (\p -> head p <= n) primes2
爲什麼primesTo1
比primesTo2
快了很多,即使使用不同的功能; primesTo1
使用++
,last
& init
代替:
,head
& tail
在primesTo2
使用。
的ghci
輸出與:set +s
:
*Main> primesTo1 10000
...
(0.51 secs, 124779776 bytes)
*Main> primesTo2 10000
...
(3.30 secs, 570648032 bytes)
與ghc -O2
編譯:
$ time ./primes1
...
./primes1 0.06s user 0.00s system 68% cpu 0.089 total
$ time ./primes2
...
./primes2 0.28s user 0.00s system 98% cpu 0.283 total
注:我不是找Haskell的最佳素數生成器,我我只是被兩個函數的速度差所迷惑。
'primes1'掃描自下而上,'primes2'自頂向下掃描。後者是一個非常糟糕的慢方法來過濾出複合數字。 –
@ n.m。謝謝,這很有道理。 – Tyilo
還有更多的數字可以被2或3除以997整除。 –