2011-10-20 2 views
7

Ruby用のNArrayライブラリを見つけたばかりです。この質問に私の無知を言い訳してください:)Array上でRuby NArrayを使用する利点は何ですか?

標準のRuby Array実装よりもNArrayライブラリを使用する利点は何ですか?

NArrayは数値計算に向いていますが、APIを見れば、配列にはいくつかの拡張があり、数値に合わせているようです.Arrayではできないものはありません。

  1. なぜArrayを使用しないのですか?
  2. 速度に大きな利点がありますか?
  3. メモリに大きな利点がありますか?
  4. 通常のRuby Arrayクラスを使用すること以外の利点はありますか?

Googleは本当にこの質問の有用な説明を考え出しませんでした。私が見つけた

参考文献:

http://rubydoc.info/gems/narray-ruby19/0.5.9.7/NArray

http://narray.rubyforge.org/index.html.en

http://raa.ruby-lang.org/project/narray/

+0

Rubyで数値配列の更新されたライブラリがありますがそれができる(https://github.com/sciruby/nmatrix)[NMatrix]と呼ばれます便利である。 :P – agarie

答えて

10

もNArrayについてスライドを参照してください: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

、それがどのように見えます配列上にわずかな拡張があります

いいえ、それは配列とはまったく異なります。 NArrayには、多くの数値関数と多次元のフィーチャがあります。 一方、NArrayは静的です。それは NArrayのメソッドリストがhttp://narray.rubyforge.org/SPEC.en

_1であるなど、プッシュ/ポップ・メソッドを持っていません。なぜArrayを使うのではないのですか?

配列にはRubyオブジェクトが格納されます。数値を保持するのは非効率的です。

_2。巨大なスピードの利点はありますか?

はい。上記スライドのp.36は、NArrayが最大50倍高速であることを示しています。

ループがRubyで記述されている場合、配列はNArrayよりも高速です。

_3。巨大なメモリの利点はありますか?

はい。 Float値に関しては、Arrayは私の64ビットLinuxマシンでNArrayより約4倍多くのメモリを消費します。

_4。通常のRuby Arrayクラスを使用すること以外の利点はありますか?数値関数の多次元アレイ

  • サポート
  • アレイ項目のガベージコレクションの必要はありませんの

    • サポート。大規模な配列ではGCに時間がかかります。
    • など
    +0

    +1詳細な回答ありがとうございます!ドモ! – Tilo

    4

    私は、NArrayは数値計算に向けたが、APIを見ていることを見てきた数値に向けたアレイの上にわずか数の拡張があるように見える - 何もしないことNArrayは、ちょうどは数値処理のためを拡張されていない、それはまたを制限されている:あなたが最も重要なポイントを逃している。.. Arrayで

    を行うことができませんでした。特に

    • NArray要素できのみれる固定サイズの整数または
    • NArrayはまた、固定サイズ、それらが縮小または成長できないれている自分自身をだ浮遊

    NArrayの実装優れたパフォーマンスを提供するためにこれらの制限をに悪用してください。

    +0

    +1ああ、そうです。ヴィーレン・ダンク! – Tilo

    1

    大規模な型付き配列の作成では、小さな配列の作成(例:一時的な中間オブジェクトの場合)では、高速であるように見えますが、NArrayは高速になります。

    ベンチマークコード:

    require 'benchmark' 
    
    n1 = 1000000 
    n2 = 10000 
    Benchmark.bm do |x| 
        x.report("NArray short float length 5:") { n1.times { NArray.sfloat(5) } } 
        x.report("NArray long float length 5 :") { n1.times { NArray.float(5) } } 
        x.report("NArray short int length 5 :") { n1.times { NArray.sint(5) } } 
        x.report("NArray long int length 5 :") { n1.times { NArray.int(5) } } 
        x.report("NArray object length 5  :") { n1.times { NArray.object(5) } } 
        x.report("Ruby Array length 5  :") { n1.times { Array.new(5) } } 
    
        x.report("NArray short float length 10000:") { n2.times { NArray.sfloat(10000) } } 
        x.report("NArray long float length 10000 :") { n2.times { NArray.float(10000) } } 
        x.report("NArray short int length 10000 :") { n2.times { NArray.sint(10000) } } 
        x.report("NArray long int length 10000 :") { n2.times { NArray.int(10000) } } 
        x.report("NArray object length 10000  :") { n2.times { NArray.object(10000) } } 
        x.report("Ruby Array length 10000  :") { n2.times { Array.new(10000) } } 
    end 
    

    結果:

           user  system  total  real 
    NArray short float length 5: 0.740000 0.020000 0.760000 ( 0.756466) 
    NArray long float length 5 : 0.770000 0.020000 0.790000 ( 0.791446) 
    NArray short int length 5 : 0.750000 0.020000 0.770000 ( 0.772591) 
    NArray long int length 5 : 0.760000 0.020000 0.780000 ( 0.777375) 
    NArray object length 5  : 0.780000 0.020000 0.800000 ( 0.801149) 
    Ruby Array length 5  : 0.450000 0.010000 0.460000 ( 0.461501) <==== 
    NArray short float length 10000: 0.230000 0.050000 0.280000 ( 0.281369) 
    NArray long float length 10000 : 0.430000 0.000000 0.430000 ( 0.428917) 
    NArray short int length 10000 : 0.110000 0.010000 0.120000 ( 0.113683) 
    NArray long int length 10000 : 0.230000 0.040000 0.270000 ( 0.275942) 
    NArray object length 10000  : 0.460000 0.110000 0.570000 ( 0.570558) 
    Ruby Array length 10000  : 0.440000 0.040000 0.480000 ( 0.476690) 
    
    関連する問題