Приводят в пример Финляндию, но в Хельсинки средняя температура января -5, что ближе к Сочи, а не к Челябинску, где средняя температура -25.
Всё-таки скорее -15 в Челябинске. Ну и Финляндия бывает не только Южная. А можете ещё, пожалуйста, дать ссылки на утверждение про стоимость кап.строительства?
Замечу, что у функцииeinsum есть параметр optimize, который отвечает за то, будут ли ваши суммы считаться эффективно или как придётся. По дефолту оптимизация выключена, поэтому при неудачном стечении обстоятельств вычисления могут получиться очень неоптимальными. В примере ниже вычисляется вектор A*A*x. Без оптимизации сначала перемножаются две матрицы n x n за O(n^3), а потом уже произойдёт умножение на вектор. С оптимизацией всё будет хорошо: произойдёт два умножения матрицы на вектор и сложность будет O(n^2).
import numpy as np
n = 1000
x = np.ones((n,))
A = np.ones((n,n))
%time _ = np.einsum("ij,jk,k->i", A,A,x)
> CPU times: user 2.51 s, sys: 3 µs, total: 2.51 s
> Wall time: 2.51 s
%time _ = np.einsum("ij,jk,k->i", A,A,x, optimize=True)
> CPU times: user 635 µs, sys: 8.01 ms, total: 8.65 ms
> Wall time: 8.55 ms
Можно ещё указывать optimize="optimal", тогда из всех вариантов вычисления суммы будет выбран оптимальный, в то время как optimize=True (алиас для optimize="greedy") означает использование жадного алгоритма для оптимизации.
Всё-таки скорее -15 в Челябинске. Ну и Финляндия бывает не только Южная. А можете ещё, пожалуйста, дать ссылки на утверждение про стоимость кап.строительства?
Ваша правда, в следующей части всё постараюсь учесть.
Согласен, в единой шкале было бы понятнее. Я сейчас готовлю продолжение, где отчётливей высвечу именно эти отношения.
Вообще звучит как баг.
Замечу, что у функции
einsum
есть параметрoptimize
, который отвечает за то, будут ли ваши суммы считаться эффективно или как придётся. По дефолту оптимизация выключена, поэтому при неудачном стечении обстоятельств вычисления могут получиться очень неоптимальными. В примере ниже вычисляется векторA*A*x
. Без оптимизации сначала перемножаются две матрицыn x n
заO(n^3)
, а потом уже произойдёт умножение на вектор. С оптимизацией всё будет хорошо: произойдёт два умножения матрицы на вектор и сложность будетO(n^2)
.Можно ещё указывать
optimize="optimal"
, тогда из всех вариантов вычисления суммы будет выбран оптимальный, в то время какoptimize=True
(алиас дляoptimize="greedy"
) означает использование жадного алгоритма для оптимизации.