新手问题 嵌套 for 循环次数太多,是否能用多线程 Thread 提高代码运行效率?

babywhy · 2013年04月26日 · 最后由 jimrokliu 回复于 2013年04月27日 · 7288 次阅读

双层 for 循环构建矩阵, for i in 0...10000 for j in 0...10000 次数太多导致运行很慢。 试想把矩阵平均分成左上、左下、右上、右下 4 块,每块是一个线程 Thread,这样构建起来是不是时间更短??效率更高??或是 ruby 同一时间内只能运行一个内核线程,总共的构建时间是相同的? 求大神回复。

可能是内存重分配太多造成的,用 Array.new 10000 直接创建大小为 10000 的矩阵

另外不知到你的实际问题是什么,或者可以用稀疏矩阵的技巧

另外,极少在 Ruby 代码中能看到 for 语句。

另外如果是数值矩阵,用 NMatrix 就已经足够快了

实际问题是构建共现词矩阵。 部分代码: for rowindex in 0...keyscount for colindex in rowindex...keyscount if keys[rowindex] != keys[colindex] then matrixnum = 0 for k in 0...doccount if doc[k].include? keys[rowindex] and doc[k].include? keys[colindex] rownum = doc[k].scan(keys[rowindex]).count colnum = doc[k].scan(keys[colindex]).count matrixnum += (rownum > colnum) ? colnum : rownum end end else matrixnum = 0 end matrix[rowindex][colindex] = matrixnum end end 因为 keyscount 数目比较大,不知道该怎样去优化了。最后构建的为数值矩阵。

哦,其实瓶颈在 doc[k].scan 上面啦,你可以先建立一个索引,从 key 可以快速查出词频,然后利用此索引查找就快了。

doc_key_count = doc.map do |d|
  h = {}
  keys.each{|key| h[key] = d.scan(key).count }
  h
end

for rowindex in 0...keyscount
  for colindex in (rowindex + 1)...keyscount
    matrixnum = 0
    doc_key_count.each do |d|
      rownum = d[keys[rowindex]]
      colnum = d[keys[colindex]]
      matrixnum += (rownum > colnum) ? colnum : rownum
    end
    matrix[rowindex][colindex] = matrixnum
  end
end

上面代码没测试... 意思明白就可以...

大神,请受我一拜!!

线程不能解决速度的问题,因为并发的同步还会减慢你的运算。改进算法是正确的方法。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号