Каковы преимущества использования Ruby NArray над Array?
Я только что натолкнулся на библиотеку NArray для Ruby - извините за невежество, когда задаю этот вопрос:)
Каковы преимущества использования библиотеки NArray по сравнению со стандартной реализацией Ruby Array?
Я видел, что NArray ориентирован на числовые вычисления, но, глядя на API, похоже, что в Array есть только несколько расширений, ориентированных на числовые значения - ничего, что вы не могли бы сделать с Array..
- Почему бы просто не использовать массив?
- Есть ли огромное преимущество в скорости?
- Есть ли огромное преимущество в памяти?
- Есть ли другие преимущества по сравнению с обычным классом Ruby Array?
Google действительно не придумал полезного объяснения этого вопроса.
Ссылки, которые я нашел:
http://rubydoc.info/gems/narray-ruby19/0.5.9.7/NArray
3 ответа
Смотрите также слайд о NArray: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby
похоже, есть только несколько расширений над массивом
Нет, это полностью отличается от массива. NArray имеет много числовых функций и многомерных функций. С другой стороны, NArray является статическим; у него нет методов push / pop и т. д. Список методов NArray: http://narray.rubyforge.org/SPEC.en
_1. Почему бы просто не использовать массив?
Массив содержит объекты Ruby. Неэффективно держать числовые значения.
_2. Есть ли огромное преимущество в скорости?
Да. стр.36 из приведенного выше слайд-шоу NArray до 50 раз быстрее.
Обратите внимание, что Array работает быстрее, чем NArray, если цикл написан на Ruby.
_3. Есть ли огромное преимущество в памяти?
Да. Что касается значений Float, Array потребляет примерно в 4 раза больше памяти, чем NArray на моей 64-битной машине Linux.
_4. Есть ли другие преимущества по сравнению с обычным классом Ruby Array?
- Поддержка многомерного массива
- Поддержка числовых функций
- Нет необходимости в сборке мусора для элементов Array. GC занимает много времени для больших массивов.
- и т.п.
Я видел, что NArray ориентирован на числовые вычисления, но, глядя на API, похоже, что в Array есть только несколько расширений, ориентированных на числовые значения - ничего, что вы не могли бы сделать с Array..
Вам не хватает самого важного момента: NArray
не только расширен для числовой обработки, он также ограничен. Особенно
NArray
элементы могут быть только целыми числами или числами с фиксированным размеромNArray
Сами также имеют фиксированный размер, они не могут уменьшаться или расти
Реализация NArray
может использовать эти ограничения для обеспечения превосходной производительности.
Для создания массива большого типа 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)