Lua:如何有效地增加 - 一维表中包含数字

时间:2018-05-30 20:16:34

标签: algorithm lua multiplication

假设我们有一个名为t的Lua表,定义如下:

t = {4, 5, 6, 7}

假设我们希望进一步了解t中数字的乘积。 (旁白:答案是840。)我可以想到两种方法。

首先,基本的for循环:

answer = 1
for i = 1, #t do
   answer = answer * t[i]
end
print ( answer )

其次,ipairs迭代器:

answer = 1 
for i, j in ipairs ( t ) do
   answer = answer * j
end
print ( answer )

(我想也可以使用pairs迭代器。)

我的问题:

  • 上面显示的两种方法中的任何一种都有任何真正的缺点吗?
  • 是否有方法可以获得比上述方法更有效和/或更强大的answer的期望值?

1 个答案:

答案 0 :(得分:3)

ipairs涉及函数调用。这使得通用的for循环更慢一点点。如果内部任务是复杂的,那么函数调用开销可以忽略不计,与一些算术运算相比,它在某些极端情况下可能是值得注意的。试试吧:

a={} 
for i=1,2e8 do a[i]=math.random() end
t=os.time()
q=1
for i=1,#a do q=q*a[i] end 
print(os.time()-t)
w=1
t=os.time()
for i,v in ipairs(a) do w=w*v end
print(os.time()-t)

对我来说,结果是1518。 当计算重复多次(嵌套循环)时,它会更有影响力:

a={} for i=1,1e4 do a[i]=math.random() end
t=os.time() q=1; for i=1,1e5 do for j=1,1e4 do q=q*a[j] end end print(os.time()-t)
t=os.time() q=1; for i=1,1e5 do for _,v in ipairs(a) do q=q*v end end print(os.time()-t)

但仍然不是很多。

如果你真的需要挤出这一点性能,你可能应该看看luajit以及基于它的各种数字框架:12,{{ 3}}。 此外,语言作者对3进行了优化。