No need to use nested tables (see also here). The documentation for Table gives:
Table[expr,{i,imin,imax},{j,jmin,jmax},…] gives a nested list. The
list associated with i is outermost.
momentum = RandomReal[{-1, 1}, {5, 90, 6000}];
With nested tables:
AbsoluteTiming[
finalResultEnergyNested = Table[Table[Table[
Sqrt[
momentum[[index, j, i]]^2 + momentum[[index, j, i + 1]]^2 +
momentum[[index, j, i + 2]]^2 + m^2],
{i, 1, Dimensions[momentum][[3]], 3}],
{j, 1, Dimensions[momentum][[2]], 1}],
{index, 1, Dimensions[momentum][[1]], 1}
];
]
(*{205.798, Null}*)
With non-nested tables:
AbsoluteTiming[
finalResultEnergy = Table[
Sqrt[momentum[[index, j, i]]^2 + momentum[[index, j, i + 1]]^2 +
momentum[[index, j, i + 2]]^2 + m^2],
{index, 1, Dimensions[momentum][[1]], 1},
{j, 1, Dimensions[momentum][[2]], 1},
{i, 1, Dimensions[momentum][[3]], 3}
];
]
(*{37.4112, Null}*)
A third option:
AbsoluteTiming[
finalResultEnergyAlt =
Sqrt[Map[Plus @@@ Partition[#, 3] &, momentum^2, {2}] + m^2];
]
(*{16.1016, Null}*)
These are just some ideas (not sure if there are better practices), but hope that helps a bit.