2011-10-20 9 views
7

Właśnie natknąłem biblioteki NArray Ruby - proszę wybaczyć moją ignorancję, gdy z tym pytaniem :)Jakie są zalety używania Ruby NArray over Array?

Jakie są zalety korzystania z biblioteki NArray ponad standardowej implementacji Array Ruby?

Widziałem, że NArray jest nastawiony na obliczenia numeryczne, ale patrząc na API, wygląda na to, że istnieje tylko kilka rozszerzeń w stosunku do Array nastawionych na wartości numeryczne - nic, czego nie można zrobić z Array.

  1. Dlaczego po prostu nie używać funkcji Array?
  2. Czy istnieje duża przewaga prędkości?
  3. Czy istnieje ogromna przewaga pamięci?
  4. Jakieś inne korzyści w porównaniu z używaniem zwykłej klasy Ruby Array?

Google tak naprawdę nie wymyśliło użytecznego wyjaśnienia tego pytania.

Referencje znalazłem:

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

Jest zaktualizowaną bibliotekę dla tablic numerycznych w Ruby o nazwie [NMatrix] (https://github.com/sciruby/nmatrix), które mogą być przydatnym. : P – agarie

Odpowiedz

10

Zobacz także slajd o NArray: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

to wygląda istnieje tylko kilka rozszerzeń nad Array

Nie, to zupełnie coś innego niż Array. NArray ma wiele funkcji numerycznych i funkcji wielowymiarowych. Z drugiej strony NArray jest statyczny; nie ma metody Push/Pop, itp lista metoda NArray jest http://narray.rubyforge.org/SPEC.en

_1. Dlaczego po prostu nie używać Array?

Tablica zawiera obiekty Ruby. Nieefektywne jest utrzymywanie wartości liczbowych.

_2. Czy istnieje ogromna przewaga prędkości?

Tak. s.36 powyższego slajdu pokazuje, że NArray jest do 50 razy szybszy.

Zauważ, że Array jest szybszy niż NArray, jeśli pętla jest zapisana w Ruby.

_3. Czy istnieje ogromna przewaga pamięci?

Tak. Jeśli chodzi o wartości Float, Array zużywa około 4 razy więcej pamięci niż NArray na 64-bitowym komputerze z systemem Linux.

_4. Jakieś inne zalety w porównaniu z używaniem zwykłej klasy Ruby Array?

  • Wsparcie wielowymiarowej tablicy
  • Wspierania numeryczne funkcji
  • Nie ma potrzeby zbierania śmieci na elementy macierzy. GC zajmuje dużo czasu dla dużych tablic.
  • itp
+0

+1 Dziękuję za szczegółową odpowiedź! domo! – Tilo

4

Widziałem że NArray jest nastawiona na informatyce numerycznej, ale patrząc na API, wygląda na to, że są tylko kilka rozszerzeń ponad Array ukierunkowane wartości liczbowych - nic, nie można zrobić z tablicy ..

brakuje najważniejszy punkt: NArray nie tylko rozszerzony do przetwarzania numerycznego, to również ograniczony. W szczególności

  • NArray elementy mogą całkowitymi tylko być ustalone wielkości lub pływa
  • NArray s sami są również stałym rozmiarze, nie może się skurczyć lub rosną

Implementacja NArray może wykorzystać te ograniczenia, aby zapewnić wysoką wydajność.

+0

+1 ahh widzę. Vielen Dank! – Tilo

1

przypadku dużych tworzenia macierzy wpisany NArray może być szybciej, ale dla małych tworzenia matrycy (na przykład dla tymczasowego obiektów pośrednich) Ruby Tablica wydaje się być szybki, to szybciej.

Kod Benchmark:

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 

Wyniki:

       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) 
Powiązane problemy