Циклы - более элегантные и более общие, но они не "обычно быстрее", чем пара встроенных умножений в одном выражении.
С одной стороны, цикл for
в python должен собрать объект, по которому вы будете взаимодействовать (вызов range
), а затем вызвать метод этого итератора для каждого элемента в цикле.
Итак, в зависимости от того, что вы делаете, если встроенная форма достаточно быстра для того, чтобы вы ее сохранили - если она все еще слишком медленная (как это обычно бывает в случае, когда мы выполняем численные вычисления в Python), вам следует использовать числовая библиотека (пример NumpY), которая может вычислять детерминанты в нативном коде. В случае такого числового кода манипуляции вы можете запустить его в сотни раз быстрее, используя собственный код.
Если yo9u нужны числовые вычисления, которые не могут быть выполнены уже созданной библиотекой, если вы ищете скорость (например, для манипулирования пикселями при обработке изображений), вы можете написать расширение, которое выполняется в собственном коде ( используя C, Cython или что-то еще), чтобы быстро.
С другой стороны, если скорость не имеет решающего значения, и вы даже заметили, что встроенное выражение просто «немного быстрее», просто используйте полный цикл - вы получите более читаемый и поддерживаемый код - что является основными причинами использования Python в конце концов.
В приведенном вами конкретном примере вы можете получить некоторое увеличение скорости в коде цикла, жестко закодировав вызовы "range" для кортежей - например, изменив:
for i in range(0, len(a)-2):
до for i in (0, 1, 2)
- обратите внимание, что, как и во встроенном случае, вы теряете возможность работать с матрицами разных размеров.