【问题标题】:Why is the stdlib implementation for primes so slow?为什么素数的标准库实现这么慢?
【发布时间】:2015-04-03 14:34:33
【问题描述】:

为了好玩,我决定用 ruby​​ 编写 Eratosthenes 筛子的代码。只是为了好玩,因为我知道有一个库函数。另外,我认为它会很快。但我发现它不是,至少在我的 ruby​​ 1.9.3 中,我的上网本快几倍,甚至在 c 中也没有。为什么会这样。

库实现:

require 'prime'
primes = Prime.each(1_000_000).to_a
print primes.size
puts

我的红宝石:

sieve = Array.new(1_000_000, true)
sieve[0..1] = [false, false]
for number in 2...Math.sqrt(sieve.size)
  if sieve[number]
    for multiple in (number ** 2...sieve.size).step(number)
      sieve[multiple] = false
    end
  end
end

primes = []
for number in 2...1_000_000
  if sieve[number]
    primes << number
  end
end
print primes.size
puts

库很慢。

【问题讨论】:

标签: ruby math primes


【解决方案1】:

primePrime.each(1_000_000).to_a 生成1_000_000 以下的所有素数。

您的方法实际上只生成低于1_000_000 平方根的所有素数,即1000

【讨论】:

  • 是的,感谢您了解这一点。我更新了它。但还是同样的问题
【解决方案2】:

a) 在我的计算机上,库的执行时间平均为 0.230 秒,而您的平均执行时间为 0.270 秒。编辑:我在 MRI 2.2.0 上执行,而不是 1.9.3。

b) 更重要的是,MRI 的库实现也是 in Ruby,而不是 C 语言。并非 Ruby 库中的所有函数都是用本机代码编写的。

【讨论】:

  • 您使用的是什么版本的 ruby​​?
猜你喜欢
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 2013-02-22
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多