У меня есть функция, которая возвращает квадрат нормы невязки большой системы линейных уравнений.
In [1]: import numpy as np
In [2]: A = np.random.rand(3600000, 200)
In [3]: b = np.random.rand(3600000)
In [4]: def f(x):
...: global A
...: global b
...: return np.linalg.norm(A.dot(x) - b)**2
Теперь у меня есть алгоритм, в котором функция должна вычисляться несколько раз. Однако из-за размера системы уравнений каждый вызов функции на определенном x
требует много времени.
In [5]: import time
In [6]: def f(x):
...: global A
...: global b
...: start = time.time()
...: res = np.linalg.norm(A.dot(x) - b)**2
...: end = time.time()
...: return res, end - start
In [7]: test = np.random.rand(200)
In [8]: f(test)
Out[8]: (8820030785.528395, 7.467242956161499)
Мой вопрос:
Есть ли есть ли возможности сократить время вызова такой функции?
Я думал о замене np.linalg.norm(A.dot(x) - b)**2
более эффективным выражением, но не знаю, как это могло бы выглядеть.
Техническая информация. Приведенный выше код был написан на компьютере с
Результат np.show_config()
:
blas_mkl_info:
libraries = ['blas', 'cblas', 'lapack', 'pthread', 'blas', 'cblas', 'lapack']
library_dirs = ['/Users/me/miniconda3/envs/magpy/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/Users/me/miniconda3/envs/magpy/include']
blas_opt_info:
libraries = ['blas', 'cblas', 'lapack', 'pthread', 'blas', 'cblas', 'lapack', 'blas', 'cblas', 'lapack']
library_dirs = ['/Users/me/miniconda3/envs/magpy/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/Users/me/miniconda3/envs/magpy/include']
lapack_mkl_info:
libraries = ['blas', 'cblas', 'lapack', 'pthread', 'blas', 'cblas', 'lapack']
library_dirs = ['/Users/me/miniconda3/envs/magpy/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/Users/me/miniconda3/envs/magpy/include']
lapack_opt_info:
libraries = ['blas', 'cblas', 'lapack', 'pthread', 'blas', 'cblas', 'lapack', 'blas', 'cblas', 'lapack']
library_dirs = ['/Users/me/miniconda3/envs/magpy/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/Users/me/miniconda3/envs/magpy/include']