有没有什么方法可以矢量化或者加速?我已经在使用numba来进行抖动,但它仍然是一个主要的瓶颈。在一维numpy数组上使用numba来jit我的函数,可以使代码速度提高一个数量级,但在下面的二维数组上使用numba时,性能的改善可以忽略不计。分解是一个numpy矩阵,表示相关矩阵的cholesky分解,x和n是常数,nrand是随机数在
@jit
def generate_random_correlated_walks(decomposition, x, n):
uncorrelated_walks = np.empty((2*x, n))
for i in range(x):
# Generate the random uncorrelated walks
wv = nrand.normal(loc=0, scale=1, size=n)
ws = nrand.normal(loc=0, scale=1, size=n)
uncorrelated_walks[2*i] = wv
uncorrelated_walks[(2*i) + 1] = ws
# Create a matrix out of these walks
uncorrelated_walks = np.matrix(uncorrelated_walks)
m, n = uncorrelated_walks.shape
correlated_walks = np.empty((m, n))
# Go through column and correlate the walk values
for i in range(n):
correlated_timestep = np.transpose(uncorrelated_walks[:, i]) * decomposition
correlated_walks[:, i] = correlated_timestep
return correlated_walks
编辑:我已经做了建议的更改,现在我的代码如下,但不幸的是仍然是一个主要的瓶颈。有什么想法吗?在
^{pr2}$
您可以改进的第一件事是删除} 一堆次,那么它没有任何好处,如果您相信它确实会生成随机数。在
for
循环。如果您相信使用相同的输入参数调用^{不要使用^{} ,请使用^{} 。当你考虑到前一项可以用来将你的功能的整个第一部分缩短为一个步骤时,这将使你的生活更轻松。在
当然,您可以通过一个简单的矩阵乘法来完全删除最后的循环:
uncorrelated_walks.T @ decomposition
将给您当前的correlated_walks
的转置。您可以通过更改参数的顺序来避免transposes之一。在你最终会得到这样的结果:
不知道这对您有多大的帮助,但是删除Python级别的循环应该是一种提升,因为它将减少多个numy调用的开销。在
你可以牺牲易读性,把整件事变成一句话:
^{pr2}$相关问题 更多 >
编程相关推荐