【问题标题】:luajit copy table is slowluajit 复制表很慢
【发布时间】:2015-09-16 03:10:16
【问题描述】:

在更大的 lua 脚本中,我必须复制几个表 dt:

for i=1,dt:nrow() do
    local r = {}
    for j=1,dt:ncol() do
        r[j] = dt[i][j]
    end     
    rslt:append(r)
end

这些表格大约有 50,000 行 x 25 列,主要包含双精度数。 luajit 大约是“标准”lua 的 10 倍。在我之前进行的所有其他计算/操作中,luajit 更快(1.5 到 3 倍)。

【问题讨论】:

  • 您应该使用 FFI 数组对数字进行快速数据处理。除此之外,请检查-jv 和分析器的输出。
  • 如果在进入外循环之前计算dt:ncol()并将rslt:append(r)替换为更简单的代码或延迟会明显更快吗?
  • 我从 C++ 程序中的 lua 状态调用脚本。 FFI 数组不是选项,因为它也应使用“标准”lua 运行。

标签: memory lua lua-table luajit


【解决方案1】:

虽然这听起来很愚蠢,但请尝试使用 25 个值预先分配 r 表:

local r = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

不幸的是 Lua API 不允许预先分配表,所以这是避免内部循环中数组分配导致重新分配的唯一方法。我的测试显示了明显的改进,但没有接近 10 倍(虽然我没有使用你的方法,所以你的结果可能会有所不同)。

【讨论】:

  • 我也考虑过。但不幸的是,表格也可以有不同数量的列。
  • 您可以使用 loadstring,但它可能会扼杀所有性能提升;另一种选择是使用if 语句,根据所需的列数分配该表。
  • 您还可以编写一个简单的模块来将lua_createtable 公开给您的lua 代码,这样您就可以直接访问表中的初始元素数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
相关资源
最近更新 更多