2011-10-20 17 views
7

me encontré con la biblioteca NArray para Ruby - disculpen mi ignorancia cuando se hace esta pregunta :)¿Cuáles son las ventajas de usar Ruby NArray sobre Array?

¿Cuáles son las ventajas del uso de la biblioteca NArray de la ejecución de matriz estándar de Ruby?

He visto que NArray está orientado a la computación numérica, pero mirando la API, parece que hay solo unas pocas extensiones sobre Array orientadas a valores numéricos, nada que no se pueda hacer con Array.

  1. ¿Por qué no usar Array?
  2. ¿Hay una gran ventaja de velocidad?
  3. ¿Hay una gran ventaja de memoria?
  4. ¿Tiene alguna otra ventaja sobre el uso de la clase regular Ruby Array?

Google realmente no se le ocurrió una explicación útil de esta pregunta.

Las referencias que he encontrado:

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

Hay una biblioteca actualizada para las matrices numéricas en Ruby llamada [NMatrix] (https://github.com/sciruby/nmatrix) que puede sé útil. : P – agarie

Respuesta

10

Véase también la diapositiva sobre NArray: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

que parece solo hay unas pocas extensiones sobre Array

No, es completamente diferente de Array. NArray tiene muchas funciones numéricas y funciones multidimensionales. Por otro lado, NArray es estático; que no tiene métodos push/pop, etc. lista de métodos de NArray es http://narray.rubyforge.org/SPEC.en

_1. ¿Por qué no usar Array?

Matriz contiene Ruby Objects. Es ineficiente para mantener valores numéricos.

_2. ¿Hay una gran ventaja de velocidad?

Sí. La p.36 de la diapositiva anterior muestra que NArray es hasta 50 veces más rápido.

Tenga en cuenta que Array es más rápido que NArray si el ciclo está escrito en Ruby.

_3. ¿Hay una gran ventaja de memoria?

Sí. En cuanto a los valores de Float, Array consume aproximadamente 4 veces más memoria que NArray en mi máquina Linux de 64 bits.

_4. ¿Alguna otra ventaja sobre usar la clase regular de Ruby Array?

  • Soporte de multi-dimensional array
  • apoyo de las funciones numéricas
  • No hay necesidad de recolección de basura en los elementos de matriz. GC lleva mucho tiempo para arreglos grandes.
  • etc.
+0

+1 ¡Gracias por la respuesta detallada! Domo! – Tilo

4

he visto que NArray está orientada a la computación numérica, pero mirando a la API, parece que sólo hay unas pocas extensiones más orientadas a la matriz de valores numéricos - nada que no se podía hacer con la matriz ..

te estas perdiendo el punto más importante: NArray no es sólo extendieron para el procesamiento numérico, también es limitado . En particular

  • NArray elementos pueden enteros de tamaño fijo solamente ser o flotadores
  • NArray s en sí mismos son también de tamaño fijo, no pueden reduzca o crezca

Una implementación de NArray puede explote esas restricciones para proporcionar un rendimiento superior.

+0

+1 ahh, ya veo. Vielen Dank! – Tilo

1

Para la creación de matriz tipada grande NArray puede ser más rápido, aunque para la creación de matriz pequeña (por ejemplo, para objetos intermedios temporales), la matriz de Ruby parece ser más rápida es más rápida.

código de referencia:

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 

Resultados:

       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) 
Cuestiones relacionadas