Ruby 为什么prime的stdlib实现如此缓慢?

Ruby 为什么prime的stdlib实现如此缓慢?,ruby,math,primes,Ruby,Math,Primes,为了好玩,我决定用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] =

为了好玩,我决定用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
sieve=Array.new(1_000_000,true)
筛[0..1]=[假,假]
对于2中的数字…数学sqrt(筛子大小)
如果筛子[数量]
对于多英寸(编号**2…筛子尺寸)。步骤(编号)
筛选[多个]=错误
结束
结束
结束
素数=[]
对于2…1_000_000中的数字
如果筛子[数量]

素数The
prime
library
prime.each(1_000_000)。to_a
生成
1_000_000
下面的所有素数

您的方法实际上只生成
1\u 000\u 000
平方根以下的所有素数,即
1000
a)在我的计算机上,库在0.230s内执行,您的实现平均在0.270s内执行。编辑:我执行的是MRI 2.2.0,而不是1.9.3


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

是的,谢谢您的关注。我更新了它。但是仍然有同样的问题,你使用的是什么版本的ruby?我想是时候升级到2.2了,如果你想再快一点的话,可以使用数字轮,如中所述。