Этот ответ объясняет, почему вы не хотите использовать reduce
для этого в Python.
Рассмотрим фрагмент
reduce(operator.add, [[1], [2], [3], [4], [5]])
Какое это имеет отношение?
[1] + [2] => [1, 2]
[1, 2] + [3] => This makes a new list, having to go over 1, then 2, then 3. [1, 2, 3]
[1, 2, 3] + [4] => This has to copy the 1, 2, and 3 and then put 4 in the new list
[1, 2, 3, 4] + [5] => The length of stuff I have to copy gets bigger each time!
Такое квадратичное поведение вполне можно избежать: исходное решение (и любое количество других решений) не образуют эти промежуточные этапы копирования.