Lua: Как эффективно умножить все элементы в одномерной таблице, состоящей из чисел - PullRequest
0 голосов
/ 30 мая 2018

Предположим, что у нас есть таблица 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, которые являются более эффективными и / или надежными, чем методы, показанные выше?

1 Ответ

0 голосов
/ 31 мая 2018

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 .Также есть статья по оптимизации автора языка.

...