<p>在您的情况下<code>np.linalg.norm</code>只是</p>
<pre><code>np.sqrt(dot(x,x))
</code></pre>
<p>因此,您最好做以下工作:</p>
<pre><code>temp = np.dot(A,x) - b # temp = A@x-b
return np.dot(temp, temp) # return temp@temp
</code></pre>
<p>跳过不必要的sqrt/square。但与最初的<code>A@x</code>相比,这可能是个小问题</p>
<p>在一台相当普通的Linux4Gb计算机上,您的测试用例给了我(在创建<code>A</code>时)</p>
<pre><code>MemoryError: Unable to allocate 5.36 GiB for an array with shape (3600000, 200) and data type float64
</code></pre>
<p>虽然你显然有足够的记忆力,但你可能正在突破这一界限。在另一个例子中,我们已经看到,由于内存管理问题,使用非常大的数组的<code>dot/@</code>会减慢速度。通常,人们通过进行某种“块”处理来提高速度。如果您正在使用3d“批处理”进行<code>matmul</code>,那么这很容易。你的普通案件就不那么明显了</p>
<p>将<code>A</code>大小减少10:</p>
<pre><code>In [423]: A.shape
Out[423]: (360000, 200)
In [424]: temp = A@x-b; res = temp@temp
In [425]: res
Out[425]: 938613433.9717302
In [426]: np.linalg.norm(A.dot(x)-b)**2
Out[426]: 938613433.9717301
</code></pre>
<p>时间上没有太大不同:</p>
<pre><code>In [428]: timeit temp = A@x-b; res = temp@temp
85 ms ± 529 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [429]: timeit np.linalg.norm(A.dot(x)-b)**2
86.1 ms ± 1.61 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
</code></pre>
<p>事实上,正是<code>A.dot(x)</code>主导了时间安排;其余的可以忽略不计</p>
<p>将<code>A</code>的大小加倍,大约使时间加倍(175-180范围)</p>
<p>我不是图书馆专家,但我相信<code>MKL</code>是一个更快的选择,我没有(但你似乎有)</p>