回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个函数,它返回一个大的线性方程组的剩余范数的平方</p>
<pre><code>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
</code></pre>
<p>现在我有了一个算法,在这个算法中,函数必须被求值几次。然而,由于方程系统的大小,在某个<code>x</code>处的每个函数调用都需要很多时间</p>
<pre><code>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)
</code></pre>
<p>我的问题是:</p>
<blockquote>
<p>Are there any possibilities for reducing the time of such a function
call?</p>
</blockquote>
<p>我曾想过用一个更高效的表达式替换<code>np.linalg.norm(A.dot(x) - b)**2</code>,但我不知道这会是什么样子</p>
<hr/>
<p><em>技术信息</em>上面的代码是在带有</p>
<ul>
<li>macOS Catalina版本10.15.5</li>
<li>2.3 GHz双核Intel Core i5(涡轮增压高达3.6 GHz)和64 MB eDRAM</li>
<li>8 GB 2133 MHz LPDDR3 RAM(板载)</li>
<li>
<pre><code> Memory:
Memory Slots:
ECC: Disabled
Upgradeable Memory: No
BANK 0/DIMM0:
Size: 4 GB
Type: LPDDR3
Speed: 2133 MHz
Status: OK (...)
BANK 1/DIMM0:
Size: 4 GB
Type: LPDDR3
Speed: 2133 MHz
Status: OK (...)
</code></pre>
</li>
</ul>
<p><code>np.show_config()</code>的结果是</p>
<pre><code>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']
</code></pre>