7

Ruby用のNArrayライブラリに出くわしました。この質問をするときは無知です。

標準のRubyArray実装に比べてNArrayライブラリを使用する利点は何ですか?

NArrayは数値計算を対象としていることを確認しましたが、APIを見ると、数値を対象としたArrayの拡張機能はごくわずかであるように見えます。Arrayでは不可能なことは何もありません。

  1. アレイを使用しないのはなぜですか?
  2. 速度に大きな利点はありますか?
  3. 大きなメモリの利点はありますか?
  4. 通常のRubyArrayクラスを使用するよりも他の利点はありますか?

グーグルはこの質問の有用な説明を実際に思いついたわけではありません。

私が見つけた参考文献:

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/

4

3 に答える 3

10

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

Arrayにはほんの少しの拡張機能があるようです

いいえ、アレイとはまったく異なります。NArrayには、多くの数値関数と多次元機能があります。一方、NArrayは静的です。プッシュ/ポップメソッドなどはありません。NArrayのメソッドリストはhttp://narray.rubyforge.org/SPEC.enです。

_1。アレイを使用しないのはなぜですか?

配列はRubyオブジェクトを保持します。数値を保持するのは非効率的です。

_2。速度に大きな利点はありますか?

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

ループがRubyで記述されている場合、ArrayはNArrayよりも高速であることに注意してください。

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

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

_4。通常のRubyArrayクラスを使用するよりも他の利点はありますか?

  • 多次元配列のサポート
  • 数値関数のサポート
  • 配列アイテムのガベージコレクションは必要ありません。大きなアレイの場合、GCには長い時間がかかります。
于 2011-10-20T09:00:51.420 に答える
5

NArrayは数値計算を対象としていることを確認しましたが、APIを見ると、数値を対象としたArrayの拡張機能はごくわずかであるように見えます。Arrayでは不可能なことは何もありません。

最も重要な点が欠けています。数値処理のために拡張さNArrayれているだけでなく、制限されています。特に

  • NArray要素は、固定サイズの整数または浮動小数点数のみにすることができます
  • NArrays自体も固定サイズであり、縮小または拡大することはできません

の実装は、これらの制限を利用して優れたパフォーマンスを提供NArrayできます。

于 2011-10-20T10:44:55.503 に答える
1

大きな型の配列の作成ではNArrayの方が高速ですが、小さな配列の作成(一時的な中間オブジェクトなど)の場合はRuby配列の方が高速です。

ベンチマークコード:

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)
于 2014-05-03T18:55:03.693 に答える