【发布时间】:2010-01-13 01:05:21
【问题描述】:
我在写这篇文章时的最初目标是尽可能减少占用空间。我可以自信地说,这个目标已经实现。不幸的是,这给我带来了相当缓慢的实施。要生成所有低于 200 万的素数,在 3Ghz 英特尔芯片上大约需要 8 秒。
有没有什么办法可以在减少内存占用的情况下缩短这段代码的执行时间?或者,从功能的角度来看,我是不是走错了路?
代码
/// 6.5s for max = 2,000,000
let generatePrimeNumbers max =
let rec generate number numberSequence =
if number * number > max then numberSequence else
let filteredNumbers = numberSequence |> Seq.filter (fun v -> v = number || v % number <> 0L)
let newNumberSequence = seq { for i in filteredNumbers -> i }
let newNumber = newNumberSequence |> Seq.find (fun x -> x > number)
generate newNumber newNumberSequence
generate 2L (seq { for i in 2L..max -> i })
更新
我调整了算法并设法缩短了 2 秒,但内存消耗增加了一倍。
/// 5.2s for max = 2,000,000
let generatePrimeNumbers max =
let rec generate number numberSequence =
if number * number > max then numberSequence else
let filteredNumbers = numberSequence |> Seq.filter (fun v -> v = number || v % number <> 0L) |> Seq.toArray |> Array.toSeq
let newNumber = filteredNumbers |> Seq.find (fun v -> v > number)
generate newNumber filteredNumbers
generate 2L (seq { for i in 2L..max -> i })
更新
显然,我使用的是旧编译器。使用最新版本,我的原始算法需要 6.5 秒而不是 8 秒。这是一个很大的进步。
【问题讨论】:
标签: optimization f#