Одна быстрая и простая оптимизация заключается в использовании np.linalg.eigh
. (И np.linalg.eigvalsh
, если вы хотите просто собственные значения.)
Поскольку у вас есть симметричная матрица (при условии, что вы берете абсолютное значение), вы можете «сказать» numpy, чтобы использовать более эффективный алгоритм таким образом.
import numpy as np
x = np.random.random(1000)
A = np.subtract.outer(x, x)
A = np.abs(A)
w, v = np.linalg.eigh(A)
Сравнивая время, eigh
занимает ~ 5,3 секунды, а eig
- ~ 23,4 секунды.
Производительность np.linalg.eig
и т. Д. Будет сильно зависеть от того, с какими библиотеками связана numpy. Использование сильно оптимизированной библиотеки blas (например, ATLAS или Intel MKL) может иметь очень существенные различия, особенно в этом случае.
Кроме того, в зависимости от того, как построен numpy (например, был ли доступен компилятор фортрана) scipy.linalg.eigh
и т. Д. Может быть быстрее. Также существует вероятность, что scipy и numpy могут быть связаны с различными библиотеками blas, хотя это довольно маловероятно.