/ / Які переваги використання Ruby NArray перед Array? - рубін, масиви, числово-обчислювальні, наррей

У чому переваги використання Ruby NArray над Array? - рубін, масиви, чисельно-обчислювальні, нар

Я щойно натрапив на бібліотеку NArray для Рубі - вибачте за моє незнання, задаючи це питання :)

Які переваги використання бібліотеки NArray перед стандартною реалізацією Ruby Array?

Я бачив, що NArray спрямований на числовийобчислень, але, дивлячись на API, схоже, є лише декілька розширень над Array, спрямованих на числові значення - нічого, що ви не можете зробити з Array ..

  1. Чому б просто не використовувати Array?
  2. Чи є величезна перевага в швидкості?
  3. Чи є величезна перевага пам'яті?
  4. Будь-які інші переваги перед використанням звичайного класу Ruby Array?

Google насправді не придумав корисного пояснення цього питання.

Я знайшов посилання:

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/

Відповіді:

10 за відповідь № 1

Дивіться також слайд про NArray: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

схоже, що над Array є лише кілька розширень

Ні, це абсолютно відрізняється від Array.NArray має безліч числових функцій та багатовимірних функцій. З іншого боку, NArray є статичним; він не має методів push / pop тощо. Список методів NArray - http://narray.rubyforge.org/SPEC.en

_1. Чому б просто не використовувати Array?

Масив містить об’єкти Ruby. Утримувати числові значення неефективно.

_2. Чи є величезна перевага в швидкості?

Так. стор.36 з вищезазначених слайд-шоу NArray до 50 разів швидший.

Зверніть увагу, що Array швидший за NArray, якщо цикл написаний на Ruby.

_3. Чи є величезна перевага пам'яті?

Так. Що стосується значень Float, Array споживає приблизно в 4 рази більше пам'яті, ніж NArray на моїй 64-бітовій машині Linux.

_4. Будь-які інші переваги перед використанням звичайного класу Ruby Array?

  • Підтримка багатовимірного масиву
  • Підтримка числових функцій
  • Не потрібно збирати сміття для елементів масиву. GC займає багато часу для великих масивів.
  • тощо.

4 для відповіді № 2

Я бачив, що NArray спрямований на числовийобчислень, але, дивлячись на API, схоже, є лише декілька розширень над Array, спрямованих на числові значення - нічого, що ви не можете зробити з Array ..

Ви пропустили найважливіший момент: NArray це не просто розширено для чисельної обробки це також обмежений. Зокрема

  • NArray елементи можуть тільки бути цілими чи плаваючими числами фіксованого розміру
  • NArrayСамі також мають фіксований розмір, вони не можуть зменшуватися або рости

Впровадження NArray може експлуатувати ці обмеження для забезпечення чудової продуктивності.


1 для відповіді № 3

Для створення великого набраного масиву NArray може бути швидшим, хоча для створення малого масиву (наприклад, для тимчасових проміжних об'єктів) Ruby Array здається швидшим, швидшим.

Код тесту:

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

Результати:

                              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)