/ / ¿Cuáles son las ventajas de usar Ruby NArray sobre Array? - rubí, matrices, computación numérica, narray

¿Cuáles son las ventajas de usar Ruby NArray sobre Array? - Ruby, matrices, computación numérica, narray.

Acabo de encontrar la biblioteca NArray para Ruby. Disculpe mi ignorancia al hacer esta pregunta :)

¿Cuáles son las ventajas de usar la biblioteca NArray sobre la implementación estándar de Ruby Array?

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

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

Google realmente no presentó una explicación útil de esta pregunta.

Referencias que encontré:

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/

Respuestas

10 por respuesta № 1

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

parece que solo hay unas pocas extensiones sobre Array

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

_1. ¿Por qué no solo usar Array?

La matriz contiene Ruby Objects. Es ineficiente mantener valores numéricos.

_2. ¿Hay una gran ventaja de velocidad?

Sí. La página 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 bucle está escrito en Ruby.

_3. ¿Hay una gran ventaja de memoria?

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

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

  • Soporte de matriz multidimensional.
  • Soporte de funciones numéricas.
  • No es necesario recolectar basura en los artículos de la matriz. GC toma mucho tiempo para grandes matrices.
  • etc.

4 para la respuesta № 2

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

Te estás perdiendo el punto más importante: NArray no es solo extendido para procesamiento numérico, también es restringido. En particular

  • NArray los elementos pueden solamente ser enteros de tamaño fijo o flotantes
  • NArrays también son de tamaño fijo, no pueden encogerse ni crecer

Una implementación de NArray poder explotar esas restricciones para proporcionar un rendimiento superior.


1 para la respuesta № 3

Para la creación de matrices con tipo grande, NArray puede ser más rápido, aunque para la creación de matrices pequeñas (por ejemplo, para objetos intermedios temporales), Ruby Array parece ser más rápido.

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)