Lua:如何高效地将一个由数字组成的一维表中的所有元素相乘

假设我们有一个 Lua 表格叫做 t,其定义如下:

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 值吗?
点赞
用户4687565
用户4687565

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和基于它的各种数值框架:123。 此外,还有一篇由语言作者撰写的优化文章

2018-05-30 21:41:09