26649


タブ区切りの3,000行ほどのCSVファイルを `CSV.table` で読み込もうとすると非常に遅かったので `CSV.read`
を試してみたところ100分の1程度で処理できました。

[code]

    Benchmark.bm 10 do |r|
      r.report "read" do
        CSV.read(filename, col_sep: "\t", headers: true, header_converters: :symbol)
      end
      r.report "table" do
        CSV.table(filename, col_sep: "\t")
      end
    end
                     user     system      total        real
    read         0.050000   0.000000   0.050000 (  0.046571)
    table        4.790000   0.010000   4.800000 (  4.814375)
    
[/code]

`CSV.table`は常に`CSV.read`に対してこれほど速度差があるのでしょうか、  
それとも何か特別な原因がある時だけ遅くなるのでしょうか？


CC BY-SA 3.0
2016-06-11T05:19:43.883
26647
2016-06-11T06:30:48.227
3271
question
ruby csv
CSV.table が CSV.read に比べて非常に遅い理由


table には `converters: :numeric` が含まれています。  
数値を変換しようとするので、遅くなります。

[code]

      def self.table(path, options = Hash.new)
        read( path, { headers:           true,
                      converters:        :numeric,
                      header_converters: :symbol }.merge(options) )
      end
    
[/code]

<https://github.com/ruby/ruby/blob/v2_3_1/lib/csv.rb#L1354-L1358>

`CSV.read` の方に `converters :numeric` を追加すると、実行時間は同じになると思います。


CC BY-SA 3.0
2016-06-11T06:19:51.810
26649
2016-06-11T06:30:48.227
2016-06-11T06:30:48.227
3068
7471
26647
answer