【问题标题】:What are the advantages of using Ruby NArray over Array?与 Array 相比,使用 Ruby NArray 有哪些优势?
【发布时间】:2011-10-20 07:04:43
【问题描述】:

我刚刚遇到了用于 Ruby 的 NArray 库——请原谅我在问这个问题时的无知 :)

与标准 Ruby Array 实现相比,使用 NArray 库有哪些优势?

我已经看到 NArray 是面向数值计算的,但是从 API 来看,似乎只有一些针对数值的 Array 的扩展——没有什么是你不能用 Array 做的......

  1. 为什么不直接使用数组?
  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/

【问题讨论】:

  • Ruby 中有一个更新的数值数组库,名为NMatrix,它很有用。 :P

标签: ruby arrays numerical-computing narray


【解决方案1】:

另见关于 NArray 的幻灯片: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

看起来 Array 上只有几个扩展

不,它与 Array 完全不同。 NArray 具有许多数值函数和多维特征。 另一方面,NArray 是静态的;它没有推送/弹出方法等。 NArray的方法列表是http://narray.rubyforge.org/SPEC.en

_1。为什么不直接使用数组?

Array 包含 Ruby 对象。保存数值是低效的。

_2。有很大的速度优势吗?

是的。上述幻灯片的第 36 页显示 NArray 的速度提高了 50 倍。

请注意,如果循环是用 Ruby 编写的,则 Array 比 NArray 快。

_3。有很大的内存优势吗?

是的。至于浮点值,在我的 64 位 Linux 机器上,Array 消耗的内存大约是 NArray 的 4 倍。

_4。与使用常规 Ruby Array 类相比,还有其他优势吗?

  • 支持多维数组
  • 支持数值函数
  • 不需要对数组项进行垃圾收集。对于大型数组,GC 需要很长时间。

【讨论】:

    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2013-09-22
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 2011-08-02
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多