假设我们有一个名为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
的期望值?答案 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)
对我来说,结果是15
和18
。
当计算重复多次(嵌套循环)时,它会更有影响力:
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以及基于它的各种数字框架:1,2,{{ 3}}。 此外,语言作者对3进行了优化。