optimization - Lua中两个表的区别

标签 optimization lua redis server-side

我在 lua 中有两个表(在生产中,a 有 18 个元素,b 有 8 个):

local a = {1,2,3,4,5,6}
local b = {3,5,7,8,9}

我需要返回 'a' 并省略 'b' 中的任何公共(public)元素 -- {1,2,4,6} 类似于 ruby​​ 命令 a-b(如果 a 和 b 是数组)。

我能想到的最好的 lua 逻辑是:

local function find(a, tbl)
    for _,a_ in ipairs(tbl) do if a_==a then return true end end
end

function difference(a, b)
   local ret = {}
   for _,a_ in ipairs(a) do
   if not find(a_,b) then table.insert(ret, a_) end
end

return ret
end

local a = {1,2,3,4,5,6}
local b = {3,5,7,8,9}

local temp = {}
temp = difference(a,b)

print(temp[1],temp[2],temp[3],temp[4])

我需要快速循环比较这些表(在生产环境中每秒至少 10K 次)。有没有更简洁的方法来做到这一点?

======

这是 Redis 服务器端脚本的一部分,我必须保护我的 Redis CPU。在干净的 Lua 进程之外,我还有两个其他选择:

1.创建两个 redis 临时键,然后为 42 的 big(O) 运行 sinter

  • 18 岁(a)
  • 8 悲伤(b)
  • 16 sinter(a,b)

2.将a和b都返回给ruby做数组比较并返回结果。

  • 每秒几千个连接的后面和四分之一的网络成本将耗尽资源。

最佳答案

试试这个:

function difference(a, b)
    local aa = {}
    for k,v in pairs(a) do aa[v]=true end
    for k,v in pairs(b) do aa[v]=nil end
    local ret = {}
    local n = 0
    for k,v in pairs(a) do
        if aa[v] then n=n+1 ret[n]=v end
    end
    return ret
end

关于optimization - Lua中两个表的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24621346/

相关文章:

redis - 如何在Redis v2.4.6中使Redis从站只读?

java - 双倍乘法与加法速度

c++ - 在二进制 {0, 255} 图像中找到中值时消除分支

file - Lua 5.2中的沙箱

lua - 在 Lua 中创建表的调试钩子(Hook)

Redis 键随机消失

ruby-on-rails-4 - Sidekiq工作条件

mysql - 如何优化 MySQL 以插入数百万行?

python - 确定性退火法

lua - 尝试在脚本中索引一个 nil 值