查看: 2138|回复: 2

[已经解决] 关于 Array 和 Table 、

[复制链接]
梦石
0
星屑
2284
在线时间
744 小时
注册时间
2010-9-6
回帖
297
发表于 2015-4-11 15:54:27 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
F1里写的是 “Ruby Array 类在处理大量信息时效率很差,因此使用了此类”

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

请大神们举一些例子0.0
undefined

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-4-11 16:11:34 | 显示全部楼层
说实话,我感觉效率差不多

[pre lang="ruby"]
size = 100

# Array

t = Time.now
a_big_array = Array.new(size) { Array.new(size) { Array.new(size) } }
size.times do |x|
  size.times do |y|
    size.times do |z|
      a_big_array[x][y][z] = x + y + z # write
      a_big_array[x][y][z] # read
    end
  end
end

p Time.now - t

# Table

t = Time.now
a_big_table = Table.new(size, size, size)
size.times do |x|
  size.times do |y|
    size.times do |z|
      a_big_table[x, y, z] = x + y + z # write
      a_big_table[x, y, z] # read
    end
  end
end

p Time.now - t[/pre]

点评

这是运行时间吗、、我这里Table怎么比Array慢...  发表于 2015-4-11 16:15
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2015-4-11 19:20:47 | 显示全部楼层
[pre lang="Ruby"]class Mat_Array
  attr_reader :n
  def initialize(n)
    @n = n
    @data = Array.new(n){ Array.new(n){ 0 } }
  end
  def [](i, j)
    return @data[j]
  end
  def []=(i, j, value)
    @data[j] = value
  end
  def *(other)
    result = Mat_Array.new(n)
    for i in 0...n
      for j in 0...n
        for k in 0...n
          result[i, j] += self[i, k] + other[k ,j]
        end
      end
    end
  end
end

class Mat_Table
  attr_reader :n
  def initialize(n)
    @n = n
    @data = Table.new(n, n)
  end
  def [](i, j)
    return @data[i, j]
  end
  def []=(i, j, value)
    @data[i, j] = value
  end
  def *(other)
    result = Mat_Array.new(n)
    for i in 0...n
      for j in 0...n
        for k in 0...n
          result[i, j] += self[i, k] + other[k ,j]
        end
      end
    end
  end
end

def test_array
  t = Time.now
  a = Mat_Array.new(100)
  b = Mat_Array.new(100)
  a * b
  p Time.now - t
end

def test_table
  t = Time.now
  a = Mat_Table.new(100)
  b = Mat_Table.new(100)
  a * b
  p Time.now - t
end
[/pre]
Table比Array快一点,但是二者应该是在一个量级上的。
这里测试Array跑完一次矩阵乘法需要3.5s,Table需要3.0s左右,我特地使用了效率低的写法。
感觉处理这类问题,浪费的时间应该在元素的读取上,如果用改良的写法能提高一倍的效率。

点评

不过如果说Table效率高的话应该在任何电脑上都是一样它比较快吧...  发表于 2015-4-11 23:30
也可能和电脑的硬件配置有关···比如我的旧电脑用VA会莫名其妙丢工程,新电脑用xp系统的时候va卡的一笔,win7变成xp卡的一笔···  发表于 2015-4-11 22:32
Table 足足慢了0.15秒....果然是系统有关吗。。  发表于 2015-4-11 22:27
和系统有关吧···你看楼上的点评  发表于 2015-4-11 20:18
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部