当前位置: 首页 > 知识库问答 >
问题:

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

曹恩
2023-03-14

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

图书馆非常慢。

共有2个答案

酆鸿彩
2023-03-14

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

b)更重要的是,MRI的库实现也是用Ruby,而不是c,Ruby库中并不是所有的函数都是用原生代码编写的。

夏晋
2023-03-14

< code>prime库< code>Prime.each(1_000_000)。to_a生成小于< code>1_000_000的所有质数。

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

 类似资料:
  • 这与 R- 查看具有任何 NA 的所有列名称有关 我比较了data.frame和data.table版本,发现data.table慢了10倍。这与大多数使用data.table的代码相反,后者确实比data.frame版本快得多。 预先设置: 可能是什么原因?

  • 本文向大家介绍为什么朴素贝叶斯如此朴素?相关面试题,主要包含被问及为什么朴素贝叶斯如此朴素?时的应答技巧和注意事项,需要的朋友参考一下 因为朴素贝叶斯有个重要的假设前提,也就是假设样本的所有特征之间是相互独立的,而这个在现实世界中是不真实的,因此说其很朴素

  • 我正在维护一个Julia库,其中包含一个函数,用于在长字符串中每80个字符后插入一行新行。 当字符串长度超过100万个字符时,此函数将变得非常慢(秒或更长)。时间的增长似乎不仅仅是线性的,可能是二次的。我不明白为什么。有人能解释一下吗? 这是一些可复制的代码: 似乎这一行是大部分时间花费的地方: 这是否意味着初始化一个新的需要很长时间?这并不能真正解释超线性运行时间。 我知道构建字符串的标准快速方

  • 问题内容: 我希望能够以这种方式一个接一个地获取句子的POS标签: 但是问题是每个句子大约需要一秒钟。还有另一种选择可用于批量执行此操作并加快处理速度。但是,如果我能逐句地做这件事,我的生活会更轻松。 有没有办法更快地做到这一点? 问题答案: 对于NLTK 3.1版,里面,是这样定义的: 因此,每次对first的调用实例化都会花费一些时间,因为它涉及加载pickle文件。 只需调用when是。因此

  • 问题内容: 我有一些针对angularjs应用运行的简单的业力/茉莉单元测试。我使用最新版本的Chrome,并在WebStorm IDE中运行测试。 有时测试套件运行非常快(0.24秒) 有时,针对完全相同的代码的完全相同的测试套件运行非常缓慢(120秒) 我尝试了所有常识性修复。我在网上搜寻了一下,以发现我在做什么错。 为什么我的测试运行如此缓慢? 问题答案: 答案很简单。 我正在使用Chrom

  • 我有两个填充数组[Int]的实现,如下所述。第一个以84毫秒的速度执行,第二个以100倍的速度执行: 为什么第二个变种需要100倍以上的时间?它不是GC,因为我可以删除第一次执行,同时删除第二次执行。我使用Scala 3在Java 11上运行它: 更重要的是,如果你打开implementation,您将通过while。。。 PS:我在Scala 2.12上重复这个测试: 所以Scala 3的问题.