У меня есть странное явление, хотя scipy.sparse.linalg.eigs
должен быть быстрее для разреженных матриц, я понимаю, что он работает медленнее, чем обычный метод eigvals
для scipy
:
In [4]: %timeit m.calc_pde_numerical_jacobian(m.initial_state)
10 loops, best of 3: 41.2 ms per loop
In [5]: %timeit m.calc_pde_analytic_jacobian(m.initial_state)
1000 loops, best of 3: 1.42 ms per loop
In [6]: %timeit m.calc_analytic_pde_eigs(m.initial_state)
1 loop, best of 3: 374 ms per loop
In [7]: %timeit m.calc_numeric_pde_eigs(m.initial_state)
1 loop, best of 3: 256 ms per loop
Таким образом, метод calc_pde_numerical_jacobian
строит плотную матрицу якобиана моей системы уравнений, а calc_pde_analytic_jacobian
строит разреженную матрицу якобиана аналитически (формат csc
). Хотя аналитический метод работает быстрее при построении разреженной матрицы якобиана, при использовании методов поиска собственных значений из scipy метод собственных значений разреженных матриц работает медленнее. Функции, которые я использую для вычисления собственных значений, таковы:
def calc_numeric_pde_eigs(self,state):
return linalg.eigvals(self.calc_pde_numerical_jacobian(state))
def calc_analytic_pde_eigs(self,state):
return sparse.linalg.eigs(self.calc_pde_analytic_jacobian(state),k=6,which='LR',return_eigenvectors=False)
Кто-нибудь знает, как это могло произойти?