Самый быстрый метод с наименьшим объемом памяти, в чистом виде - это сложение всей суммы и вычитание диагонали.
Это может показаться расточительным с точки зрения FLOPS, но обратите внимание, что теоретическая экономия относительнодля этой реализации есть только фактор 2. Если это что-то значит для вас, вам, вероятно, не следует использовать numpy в первую очередь.
Кроме того, numpy в основном имеет дело с блоками памяти, адресуемыми в виде пошаговых представлений.Если бы вы могли получить единый пошаговый взгляд на ваш треугольник, это могло бы привести к эффективной реализации.Но вы не можете (доказательство оставлено в качестве упражнения для читателя), так что вы можете смело забыть о любом по-настоящему глупом решении, которое не является вызовом оптимизированной подпрограммы C, которая решает вашу проблему для вас.И я не знаю ни одного существующего.
Но даже этот «оптимизированный» цикл C может на практике получить задницу от A.sum ().Если A смежна, эта сумма потенциально может отправлять максимально оптимизированный кэш и SIMD-оптимизированный кодовый путь.Скорее всего, любой пользователь vanilly-C, который вы напишете, будет полностью уничтожен A.sum () в тесте.