2011-10-20 33 views
7

Tôi vừa xem qua thư viện NArray cho Ruby - hãy tha thứ cho sự thiếu hiểu biết của tôi khi hỏi câu hỏi này :)Ưu điểm của việc sử dụng Ruby NArray trên Array là gì?

Ưu điểm của việc sử dụng thư viện NArray trong triển khai Ruby Array chuẩn là gì?

Tôi đã thấy rằng NArray hướng đến tính toán số, nhưng nhìn vào API, có vẻ như chỉ có một vài mở rộng trên Array hướng tới các giá trị số - không có gì mà bạn không thể làm với Array ..

  1. Tại sao không chỉ sử dụng Array?
  2. Có lợi thế tốc độ lớn không?
  3. Có lợi thế bộ nhớ lớn không?
  4. Bất kỳ ưu điểm nào khác ngoài việc sử dụng lớp Ruby Array thông thường?

Google không thực sự đưa ra giải thích hữu ích về câu hỏi này.

Tài liệu tham khảo tôi thấy:

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/

+0

Có một thư viện được cập nhật cho mảng số trong Ruby gọi [NMatrix] (https://github.com/sciruby/nmatrix) mà có thể có ích. : P – agarie

Trả lời

10

Xem thêm slide về NArray: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby

nó trông giống như chỉ có một vài tiện ích mở rộng trên Array

Không, nó hoàn toàn khác với Mảng. NArray có nhiều chức năng số và các tính năng đa chiều. Mặt khác, NArray là tĩnh; nó không có phương pháp push/pop, v.v. danh sách phương pháp của NArray là http://narray.rubyforge.org/SPEC.en

_1. Tại sao không chỉ sử dụng Array?

Mảng giữ đối tượng Ruby. Việc giữ các giá trị bằng số không hiệu quả.

_2. Có lợi thế tốc độ lớn không?

Có. p.36 của slide trên cho thấy NArray nhanh hơn tới 50 lần.

Lưu ý rằng Array nhanh hơn NArray nếu vòng lặp được viết bằng Ruby.

_3. Có một lợi thế bộ nhớ lớn không?

Có. Đối với các giá trị Float, Array tiêu thụ bộ nhớ gấp 4 lần so với NArray trên máy Linux 64 bit của tôi.

_4. Bất kỳ lợi thế nào khác khi sử dụng lớp Ruby Array thông thường?

  • Hỗ trợ đa chiều mảng
  • Hỗ trợ các chức năng bằng số
  • Không cần thu gom rác thải vào các mặt hàng Array. GC mất nhiều thời gian cho các mảng lớn.
  • , vv
+0

+1 Cảm ơn bạn đã trả lời chi tiết! domo! – Tilo

4

I have seen that NArray hướng tới máy tính số, nhưng nhìn vào API, có vẻ như chỉ có một vài phần mở rộng trên mảng hướng tới các giá trị số - không có gì mà bạn không thể làm được với mảng ..

bạn đang thiếu điểm quan trọng nhất: NArray không chỉ là mở rộng cho việc xử lý số, nó cũng là hạn chế. Đặc biệt

  • NArray yếu tố có thể số nguyên chỉ được kích thước cố định hoặc nổi
  • NArray là mình cũng kích thước cố định, họ không thể thu nhỏ hoặc phát triển

An thực hiện NArray thể khai thác những hạn chế đó để cung cấp hiệu suất vượt trội.

+0

+1 ahh, tôi hiểu rồi. Vielen Dank! – Tilo

1

Đối với việc tạo mảng được định kiểu lớn, NArray có thể nhanh hơn, mặc dù cho việc tạo mảng nhỏ (ví dụ đối với các đối tượng trung gian tạm thời) Ruby Array có vẻ nhanh hơn.

đang Benchmark:

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 

Kết quả:

       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) 
Các vấn đề liên quan