以下は、上限パラメーターまでの素数を見つけるためのエラトステネスのふるいの実装です。
現在、パラメーターが 2,000,000 の場合、コードは約 2 秒で完了します。数値を nil に設定し、それらの数値を 1 つのステップで削除するのではなく圧縮することで、1 つの余分なステップを作成していることがわかります。
これを実装するにはどうすればよいですか?私のコードの速度を改善するための他の提案はありますか?
def sieve(upper)
  i = 0
  list = (2..upper).to_a
  (2..Math.sqrt(upper)).each do |mult|
    init = mult + i
    (init..upper-1).step(mult) do |index|
      list[index] = nil
    end
    i += 1
  end
  list.compact
end