/ / Aké sú výhody použitia Ruby NArray oproti Array? - rubínové, polia, numerické výpočty, narray

Aké sú výhody použitia Ruby NArray nad Array? - rubín, polia, numerické výpočty, rozprávanie

Práve som narazil na knižnicu NArray pre Ruby - prosím, ospravedlňte moju nevedomosť pri kladení tejto otázky :)

Aké sú výhody použitia knižnice NArray oproti štandardnej implementácii Ruby Array?

Videl som, že NArray je zameraný na numerické hodnotyvýpočtová technika, ale pri pohľade na API to vyzerá, že v Array existuje iba niekoľko rozšírení zameraných na numerické hodnoty - nič, čo by ste s Array nemohli robiť ..

  1. Prečo nepoužívať iba Array?
  2. Existuje obrovská rýchlostná výhoda?
  3. Existuje obrovská pamäťová výhoda?
  4. Máte nejaké ďalšie výhody oproti použitiu bežnej triedy Ruby Array?

Google skutočne neprišiel s užitočným vysvetlením tejto otázky.

Odkazy, ktoré som našiel:

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/

odpovede:

10 pre odpoveď č. 1

Pozri tiež snímku o NArray: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

vyzerá to, že nad poľom je iba pár rozšírení

Nie, je to úplne iné ako v Array. NArray má veľa numerických funkcií a viacrozmerných funkcií. Na druhej strane je NArray statický; nemá metódy push / pop atď. Zoznam metód NArray je http://narray.rubyforge.org/SPEC.en

_1. Prečo nepoužívať iba Array?

Pole obsahuje rubínové objekty. Je neefektívne držať číselné hodnoty.

_2. Existuje obrovská rýchlostná výhoda?

Áno. str.36 vyššie uvedených prezentácií je NArray až 50-krát rýchlejší.

Všimnite si, že pole je rýchlejšie ako NArray, ak je slučka napísaná v Ruby.

_3. Existuje obrovská pamäťová výhoda?

Áno. Pokiaľ ide o hodnoty Float, Array spotrebuje na mojom 64bitovom stroji s Linuxom asi 4-krát viac pamäte ako NArray.

_4. Máte nejaké ďalšie výhody oproti použitiu bežnej triedy Ruby Array?

  • Podpora viacrozmerného poľa
  • Podpora numerických funkcií
  • Na položky Array nie je potrebný zber odpadu. GC trvá dlho pre veľké polia.
  • atď.

4 pre odpoveď č. 2

Videl som, že NArray je zameraný na numerické hodnotyvýpočtová technika, ale pri pohľade na API to vyzerá, že v Array existuje iba niekoľko rozšírení zameraných na numerické hodnoty - nič, čo by ste s Array nemohli robiť ..

Chýba vám najdôležitejší bod: NArray nie je len predĺžený pre numerické spracovanie to tiež je obmedzený, Najmä

  • NArray prvky môžu iba byť celé čísla alebo plaváky pevnej veľkosti
  • NArraySami sú tiež pevnej veľkosti, nemôžu sa zmenšovať ani zväčšovať

Implementácia NArray môcť využívať tieto obmedzenia poskytujú vynikajúci výkon.


1 pre odpoveď č. 3

Pri vytváraní veľkého typového poľa môže byť NArray rýchlejší, aj keď pri vytváraní malého poľa (napr. Pre dočasné prechodné objekty) sa zdá, že Ruby Array je rýchlejší, je rýchlejší.

Kód referenčného bodu:

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

výsledky:

                              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)