为什么素数的stdlib实现如此缓慢?

时间:2015-02-04 06:50:00

标签: ruby math primes

我决定用红宝石中的eratosthenes筛子编码以获得乐趣。只是为了好玩,因为我知道有一个库函数。而且,我认为它会很快。但是我发现它不是,至少在我的红宝石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

图书馆很慢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

a)在我的计算机上,库在0.230秒内执行,平均在0.270秒内执行。编辑:虽然我在MRI 2.2.0上执行了,而不是1.9.3。

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