7 votes

Quels sont les avantages de l'utilisation de Ruby NArray par rapport à Array ?

Je viens de découvrir la bibliothèque NArray pour Ruby - veuillez excuser mon ignorance en posant cette question :)

Quels sont les avantages de l'utilisation de la bibliothèque NArray par rapport à l'implémentation standard des tableaux en Ruby ?

J'ai vu que NArray est orienté vers le calcul numérique, mais en regardant l'API, il semble qu'il n'y ait que quelques extensions sur Array orientées vers les valeurs numériques - rien que vous ne puissiez faire avec Array .

  1. Pourquoi ne pas utiliser simplement Array ?
  2. Y a-t-il un avantage énorme en termes de vitesse ?
  3. Y a-t-il un avantage énorme en termes de mémoire ?
  4. Y a-t-il d'autres avantages à utiliser la classe Ruby Array ?

Google n'a pas vraiment trouvé d'explication utile à cette question.

Références que j'ai trouvées :

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/

10voto

masa16 Points 461

Voir également la diapositive sur le tableau NA : http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

il semble qu'il n'y ait que quelques extensions sur Array

Non, c'est complètement différent d'Array. NArray possède de nombreuses fonctions numériques et des caractéristiques multidimensionnelles. D'autre part, NArray est statique ; il n'a pas de méthodes push/pop, etc. La liste des méthodes de NArray est la suivante http://narray.rubyforge.org/SPEC.en

_1. Pourquoi ne pas utiliser simplement Array ?

Un tableau contient des objets Ruby. Il n'est pas efficace pour contenir des valeurs numériques.

_2. Y a-t-il un avantage énorme en termes de vitesse ?

Oui. La page 36 de la diapositive ci-dessus montre que NArray est jusqu'à 50 fois plus rapide.

Notez que Array est plus rapide que NArray si la boucle est écrite en Ruby.

_3. Y a-t-il un avantage énorme en termes de mémoire ?

Oui. En ce qui concerne les valeurs flottantes, Array consomme environ 4 fois plus de mémoire que NArray sur ma machine Linux 64bit.

_4. Y a-t-il d'autres avantages à utiliser la classe Ruby Array ?

  • Prise en charge des tableaux multidimensionnels
  • Prise en charge des fonctions numériques
  • Il n'est pas nécessaire d'effectuer le ramassage des ordures sur les éléments du tableau. Le GC prend beaucoup de temps pour les tableaux de grande taille.
  • etc.

5voto

Jörg W Mittag Points 153275

J'ai vu que NArray est orienté vers le calcul numérique, mais en regardant l'API, il semble qu'il n'y ait que quelques extensions sur Array orientées vers les valeurs numériques - rien que vous ne puissiez faire avec Array .

Vous passez à côté du point le plus important : NArray n'est pas seulement étendu pour le traitement numérique, il est également restreint . En particulier, les

  • NArray Les éléments peuvent seulement être des entiers ou des flottants de taille fixe
  • NArray sont également de taille fixe, ils ne peuvent ni rétrécir ni croître

Une mise en œuvre de NArray puede exploit Ces restrictions permettent d'obtenir des performances supérieures.

1voto

Nat Points 643

Pour la création de grands tableaux typés, NArray peut être plus rapide, bien que pour la création de petits tableaux (par exemple pour des objets intermédiaires temporaires), Ruby Array semble être plus rapide.

Code de référence :

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

Résultats :

                              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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X