<p>您可以使用常规的<code>NumPy</code>矢量化数组操作,这将大大加快程序的执行速度:</p>
<pre><code>from autograd import elementwise_grad as egrad
from autograd import jacobian
import autograd.numpy as np
from time import time
import datetime
n = 5000
x = np.zeros(n)
a = np.random.rand(n, n)
f = lambda x: -1 * np.sum(np.log(1-x**2) + np.log(1-np.dot(a, x)))
t_start = time()
df = egrad(f)
d2f = jacobian(egrad(df))
t_end = time() - t_start
print('Execution time: ', datetime.datetime.fromtimestamp(t_end).strftime('%H:%M:%S'))
</code></pre>
<p><strong>输出</strong></p>
<pre><code>Execution time: 02:02:27
</code></pre>
<p>一般来说,每次处理数字数据时,都应尽量避免使用<code>loops</code>进行计算,因为由于它们的标头和计数器变量的维护,它们通常会成为程序的瓶颈</p>
<p><code>NumPy</code>另一方面,为每个<code>array</code>使用一个非常短的头,并且如您所期望的,对于数值计算是高度优化的</p>
<p>请注意<code>x**2</code>,它将<code>x</code>的每个项平方化,而不是<code>x[i]*x[i]</code>,以及<code>np.dot(a, x)</code>,它仅在一个命令中执行<code>np.dot(x, a[i])</code>(其中<code>x</code>和<code>a</code>切换位置以适合所需的尺寸)</p>
<p>你可以参考<a href="https://jakevdp.github.io/PythonDataScienceHandbook/02.00-introduction-to-numpy.html" rel="nofollow noreferrer">this</a>一本很棒的电子书,它将更详细地解释这一点</p>
<p>干杯</p>