Я щойно натрапив на бібліотеку NArray для Рубі - вибачте за моє незнання, задаючи це питання :)
Які переваги використання бібліотеки NArray перед стандартною реалізацією Ruby Array?
Я бачив, що NArray спрямований на числовийобчислень, але, дивлячись на API, схоже, є лише декілька розширень над Array, спрямованих на числові значення - нічого, що ви не можете зробити з Array ..
- Чому б просто не використовувати Array?
- Чи є величезна перевага в швидкості?
- Чи є величезна перевага пам'яті?
- Будь-які інші переваги перед використанням звичайного класу 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)