0

以下に、範囲で定義されたさまざまな長さの配列の組み合わせのセットを生成する関数があります。組み合わせを処理するのに必要な時間を含む、組み合わせプロセスに関するデータを取得できるようにしたいと考えています。以下を考えると:

source = ("a".."z").to_a
range = 1..7

組み合わせを生成するコマンドは次のとおりです。

  combinations = (range).flat_map do |size|
    source.combination(size).to_a
  end

このコマンドは私のマシンで実行するのに約 5 秒かかり、971,711 の組み合わせが生成されます。ただし、関数のコンテキストでこれを実行しようとすると、以下のようになります。

def combinations(source, range)
  time_start = Time.now

  combinations = (range).flat_map do |size|
    source.combination(size).to_a
  end

  time_elapsed = (Time.now - time_start).round(1)
  puts "Generated #{combinations.count} in #{time_elapsed} seconds."
  return combinations
end

source = ("a".."z").to_a
range = 1..7

combinations(source, range)

この関数は、ほぼ即座に次を出力します。

Generated 971711 in 0.1 seconds.

...そして5秒後に組み合わせを返します。何が起きてる?そして、組み合わせを処理するのに必要な時間をどのように計算できますか?

4

2 に答える 2

0

Ubuntu 12.04 32 ビット マシンの ruby​​ 2.0.0p247 でコードを実行すると、次のような出力が得られます。

Generated 971711 in 0.6 seconds.

プログラムはその直後に終了します。

プログラムには 1puts行しかないのに、「そして 5 秒後に組み合わせを返す」とはどういう意味ですか? あなたが私たちに見せていないコードは他にありますか? どの Ruby インタープリターを実行していますか? どのオペレーティング システムですか。まだ提供していない場合は、完全なコードを提供していただけますか?

これをさらに調べたい場合は、rblineprofまたはruby ​​-prof を試すことをお勧めします。

于 2013-08-02T23:19:21.723 に答える
0

したがって、ここでの問題は、Ruby が IRB に情報を読み込んで表示できるようになるまでに 5 秒ほどかかっていることですが、「X を Y 秒で生成」しているようです。情報は実際に正しく機能しています。組み合わせを計算するのに必要な時間と、組み合わせの出力をロードして表示を開始するのに必要な時間の違いについて混乱していたため、予想よりもわずかに短かった.

于 2013-08-03T00:26:27.613 に答える