/ / Was sind die Vorteile von Ruby NArray gegenüber Array? - Ruby, Arrays, Numerical-Computing, Narray

Welche Vorteile bietet die Verwendung von Ruby NArray gegenüber Array? - Rubin, Arrays, numerisches Rechnen, Erzählen

Ich bin gerade auf die NArray-Bibliothek für Ruby gestoßen - bitte entschuldigen Sie meine Unwissenheit, wenn ich diese Frage stelle :)

Was sind die Vorteile der Verwendung der NArray-Bibliothek gegenüber der standardmäßigen Ruby Array-Implementierung?

Ich habe gesehen, dass NArray in Richtung numerische ausgerichtet istWenn man sich die API anschaut, sieht es so aus, als gäbe es nur ein paar Erweiterungen des Arrays, die sich an numerischen Werten orientieren - nichts, was man mit dem Array nicht machen könnte.

  1. Warum nicht einfach Array verwenden?
  2. Gibt es einen großen Geschwindigkeitsvorteil?
  3. Gibt es einen großen Gedächtnisvorteil?
  4. Haben Sie noch weitere Vorteile gegenüber der normalen Ruby Array-Klasse?

Google hat sich zu dieser Frage keine brauchbare Erklärung einfallen lassen.

Referenzen, die ich gefunden habe:

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/

Antworten:

10 für die Antwort № 1

Siehe auch die Folie zu NArray: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

Es sieht so aus, als gäbe es nur wenige Erweiterungen über Array

Nein, es ist völlig anders als Array. NArray hat viele numerische Funktionen und mehrdimensionale Merkmale. Andererseits ist NArray statisch; Es gibt keine Push / Pop-Methoden usw. Die Methodenliste von NArray lautet http://narray.rubyforge.org/SPEC.en

_1. Warum nicht einfach Array verwenden?

Array enthält Ruby-Objekte. Es ist ineffizient, numerische Werte zu speichern.

_2. Gibt es einen großen Geschwindigkeitsvorteil?

Ja. S.36 der obigen Diashows NArray ist bis zu 50-mal schneller.

Beachten Sie, dass Array schneller als NArray ist, wenn die Schleife in Ruby geschrieben ist.

_3. Gibt es einen großen Gedächtnisvorteil?

Ja. Bei Float-Werten belegt Array auf meinem 64-Bit-Linux-Computer etwa viermal mehr Speicher als NArray.

_4. Haben Sie noch weitere Vorteile gegenüber der normalen Ruby Array-Klasse?

  • Unterstützung von mehrdimensionalen Arrays
  • Unterstützung von numerischen Funktionen
  • Keine Speicherbereinigung für Array-Elemente erforderlich. GC benötigt viel Zeit für große Arrays.
  • etc.

4 für die Antwort № 2

Ich habe gesehen, dass NArray in Richtung numerische ausgerichtet istWenn man sich die API anschaut, sieht es so aus, als gäbe es nur ein paar Erweiterungen des Arrays, die sich an numerischen Werten orientieren - nichts, was man mit dem Array nicht machen könnte.

Ihnen fehlt der wichtigste Punkt: NArray ist nicht nur verlängert für die numerische Verarbeitung ist es auch beschränkt. Im Speziellen

  • NArray Elemente können nur Ganzzahlen oder Gleitkommazahlen mit fester Größe sein
  • NArrays selbst haben ebenfalls eine feste Größe, sie können weder schrumpfen noch wachsen

Eine Implementierung von NArray kann Ausbeuten diese Einschränkungen bieten überlegene Leistung.


1 für die Antwort № 3

Bei der Erstellung großer typisierter Arrays kann NArray schneller sein, bei der Erstellung kleiner Arrays (z. B. für temporäre Zwischenobjekte) scheint Ruby Array schneller zu sein.

Benchmark-Code:

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

Ergebnisse:

                              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)