【问题标题】:speed up array functions in Ruby加速 Ruby 中的数组函数
【发布时间】:2013-12-04 01:55:37
【问题描述】:

我有一个简单的方法可以找到素数,将它们放入一个数组中,然后将它们相加。有哪些可能的步骤来加快速度?

def prime?(number, array)
  array.each do |x|
    if number % x == 0
      return false
    end
  end
  true
end

def sum_prime(number)
  i = 0
  prime = 1
  output = [2]
  while prime < number
    if prime?(prime, output)
      i += 1
      output << prime if prime != 1
      p prime
    end 
    prime += 2
  end
  output.inject(:+)
end

sum_prime(200000)

array#each 好吗?我可以采用不同的方式连接以获得更快的结果吗?

【问题讨论】:

  • 假设您必须将值存储在一个数组中,array.inject(:+) 似乎与 ruby​​ 中的速度一样快。唯一的其他建议是使用像 C 这样的编译语言,但即使这样,改进也可能可以忽略不计。
  • 将您的结果与使用内置 Prime 类 (ruby-doc.org/stdlib-1.9.3/libdoc/prime/rdoc/Prime.html) 进行比较。那么你可能会知道你是否可以更快地获得它:)
  • 对于非常大的 sum_prime,您可以将请求发送到更快的语言。您还可以通过使用现有已知值启动哈希并从那里开始来做一些捷径:shortCut={100 => sum_prime(100), 1000 => sum_prime(1000), ad-nausum。然后你可以从最小的价值开始计算,并为自己节省相当多的内存。
  • @mr.musicman 如果不需要在数组中,则在每个 prime 可用时将每个值添加到 sum += prime
  • 如果您的目标只是对素数求和,那么downloading a list 可能会更好。

标签: ruby arrays


【解决方案1】:

这应该可行。它使用了其他人的建议:

require 'prime'
def sum_prime(limit)
  Prime.each(limit).inject(0) {|sum, num| sum + num}
end
puts sum_prime(200000)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2015-11-17
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多