【问题标题】:What are the advantages of using Ruby NArray over Array?与 Array 相比,使用 Ruby NArray 有哪些优势?
【发布时间】:2011-10-20 07:04:43
【问题描述】:
【问题讨论】:
-
Ruby 中有一个更新的数值数组库,名为NMatrix,它很有用。 :P
标签:
ruby
arrays
numerical-computing
narray
【解决方案2】:
我已经看到 NArray 是面向数值计算的,但是从 API 来看,似乎只有一些针对数值的 Array 扩展——没有什么是你不能用 Array 做的......
您错过了最重要的一点:NArray 不仅扩展用于数值处理,它也是受限。特别是
-
NArray 元素只能是固定大小的整数或浮点数
-
NArrays 本身也是固定大小的,不能缩小也不能增长
NArray 的实现可以利用这些限制以提供卓越的性能。
【解决方案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)