Project1

标题: 关于 Array 和 Table 、 [打印本页]

作者: 804173948    时间: 2015-4-11 15:54
标题: 关于 Array 和 Table 、
F1里写的是 “Ruby Array 类在处理大量信息时效率很差,因此使用了此类”

所以说处理起来有什么不同...
为什么Array会效率很差

请大神们举一些例子0.0

作者: taroxd    时间: 2015-4-11 16:11
说实话,我感觉效率差不多

RUBY 代码复制
  1. size = 100
  2.  
  3. # Array
  4.  
  5. t = Time.now
  6. a_big_array = Array.new(size) { Array.new(size) { Array.new(size) } }
  7. size.times do |x|
  8.   size.times do |y|
  9.     size.times do |z|
  10.       a_big_array[x][y][z] = x + y + z # write
  11.       a_big_array[x][y][z] # read
  12.     end
  13.   end
  14. end
  15.  
  16. p Time.now - t
  17.  
  18. # Table
  19.  
  20. t = Time.now
  21. a_big_table = Table.new(size, size, size)
  22. size.times do |x|
  23.   size.times do |y|
  24.     size.times do |z|
  25.       a_big_table[x, y, z] = x + y + z # write
  26.       a_big_table[x, y, z] # read
  27.     end
  28.   end
  29. end
  30.  
  31. p Time.now - t

作者: RyanBern    时间: 2015-4-11 19:20
RUBY 代码复制
  1. class Mat_Array
  2.   attr_reader :n
  3.   def initialize(n)
  4.     @n = n
  5.     @data = Array.new(n){ Array.new(n){ 0 } }
  6.   end
  7.   def [](i, j)
  8.     return @data[i][j]
  9.   end
  10.   def []=(i, j, value)
  11.     @data[i][j] = value
  12.   end
  13.   def *(other)
  14.     result = Mat_Array.new(n)
  15.     for i in 0...n
  16.       for j in 0...n
  17.         for k in 0...n
  18.           result[i, j] += self[i, k] + other[k ,j]
  19.         end
  20.       end
  21.     end
  22.   end
  23. end
  24.  
  25. class Mat_Table
  26.   attr_reader :n
  27.   def initialize(n)
  28.     @n = n
  29.     @data = Table.new(n, n)
  30.   end
  31.   def [](i, j)
  32.     return @data[i, j]
  33.   end
  34.   def []=(i, j, value)
  35.     @data[i, j] = value
  36.   end
  37.   def *(other)
  38.     result = Mat_Array.new(n)
  39.     for i in 0...n
  40.       for j in 0...n
  41.         for k in 0...n
  42.           result[i, j] += self[i, k] + other[k ,j]
  43.         end
  44.       end
  45.     end
  46.   end
  47. end
  48.  
  49. def test_array
  50.   t = Time.now
  51.   a = Mat_Array.new(100)
  52.   b = Mat_Array.new(100)
  53.   a * b
  54.   p Time.now - t
  55. end
  56.  
  57. def test_table
  58.   t = Time.now
  59.   a = Mat_Table.new(100)
  60.   b = Mat_Table.new(100)
  61.   a * b
  62.   p Time.now - t
  63. end

Table比Array快一点,但是二者应该是在一个量级上的。
这里测试Array跑完一次矩阵乘法需要3.5s,Table需要3.0s左右,我特地使用了效率低的写法。
感觉处理这类问题,浪费的时间应该在元素的读取上,如果用改良的写法能提高一倍的效率。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1