2011-10-20 14 views
7

Ho appena incontrato la libreria NArray per Ruby - scusate la mia ignoranza quando si chiede questa domanda :)Quali sono i vantaggi dell'uso di Ruby NArray su array?

Quali sono i vantaggi di utilizzare la libreria NArray dell'esecuzione Array standard di Ruby?

Ho visto che NArray è orientato verso il calcolo numerico, ma guardando l'API, sembra che ci siano solo poche estensioni su Array orientate verso valori numerici - nulla che non si possa fare con Array ..

  1. Perché non utilizzare solo matrice?
  2. C'è un enorme vantaggio di velocità?
  3. C'è un enorme vantaggio di memoria?
  4. Altri vantaggi rispetto all'uso della normale classe Ruby Array?

Google non ha davvero fornito una spiegazione utile di questa domanda.

Riferimenti ho trovato:

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

C'è una libreria aggiornata per le matrici numeriche in Ruby chiamato [NMatrix] (https://github.com/sciruby/nmatrix) che possono essere utile. : P – agarie

risposta

10

Vedi anche la diapositiva su NArray: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

sembra ci sono solo alcune estensioni su Array

No, è completamente diverso da Array. NArray ha molte funzioni numeriche e funzioni multidimensionali. D'altra parte, NArray è statico; non ha metodi push/pop, ecc lista il metodo di NArray è http://narray.rubyforge.org/SPEC.en

_1. Perché non usare solo l'array?

L'array contiene oggetti ruby. È inefficiente mantenere valori numerici.

_2. C'è un enorme vantaggio di velocità?

Sì. p.36 della precedente slide mostra che NArray è fino a 50 volte più veloce.

Nota che Array è più veloce di NArray se il ciclo è scritto in Ruby.

_3. C'è un enorme vantaggio di memoria?

Sì. Come per i valori Float, Array consuma circa 4 volte più memoria di NArray sulla mia macchina Linux a 64 bit.

_4. Qualche altro vantaggio rispetto all'uso della normale classe Ruby Array?

  • Supporto multi-dimensionale serie
  • supporto delle funzioni numeriche
  • Non c'è bisogno per la raccolta dei rifiuti su oggetti Array. GC richiede molto tempo per i grandi array.
  • ecc
+0

+1 Grazie per la risposta dettagliata! domo! – Tilo

4

ho visto che NArray è orientata verso calcolo numerico, ma guardando l'API, sembra che ci sono solo un paio di estensioni oltre Array orientata verso valori numerici - nulla che non si potrebbe fare con array ..

vi manca il punto più importante: NArray non è solo esteso per l'elaborazione numerica, è anche limitato. In particolare

  • NArray elementi può interi di dimensione fissa solo essere o galleggia
  • NArray stessi s sono anche di dimensioni fisse, non possono piegarsi o crescere

Un'implementazione NArray può sfruttare le restrizioni per fornire prestazioni superiori.

+0

+1 ahh, capisco. Vielen Dank! – Tilo

1

Per la creazione di array dattiloscritti, NArray può essere più veloce, anche se per la creazione di piccoli array (ad esempio per oggetti temporanei temporanei) Ruby Array sembra essere veloce è più veloce.

Codice di riferimento:

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 

Risultati:

       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) 
Problemi correlati