是否有任何方法来矢量化或以其他方式加速这一点?我已经在使用numba了,但是它仍然是一个主要的瓶颈。使用numba在一维numpy数组上jit我的函数将导致代码的速度更快,但是在下面的二维数组上使用numba基本上是一个微不足道的改进。分解是表示相关矩阵的cholesky分解的numpy矩阵,x和n是常数,nrand是numpy.random。
@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编辑:我已经做了建议的修改,现在我的代码如下所示,但不幸的是,仍然是一个主要的瓶颈。有什么想法吗?
@jit
def generate_random_correlated_walks(self, decomposition, x, n):
rows = 2*x
uncorrelated_walks = np.random.normal(loc=0, scale=1, size=(rows, n))
correlated_walks = np.empty((rows, n))
for i in range(n):
correlated_timestep = np.dot(np.transpose(uncorrelated_walks[:, i]), decomposition)
correlated_walks[:, i] = correlated_timestep
return correlated_walks发布于 2017-10-10 20:34:28
您可以改进的第一件事是删除for循环。如果您认为np.random.normal确实生成随机数,那么使用相同的输入参数多次调用它是没有好处的。
不要使用np.matrix,而是使用np.array。这将使您的生活更容易,如果您认为前面的项目可以用来缩短整个功能的第一部分为一步。
当然,您可以用一个简单的矩阵乘法完全删除最后一个循环:uncorrelated_walks.T @ decomposition将给您当前correlated_walks的转置。您可以通过更改参数的顺序来避免其中一个转座子。
你最后的下场是:
def generate_random_correlated_walks(decomposition, x, n):
uncorrelated_walks = nrand.normal(loc=0, scale=1, size=(2*x, n))
correlated_walks = np.dot(decomposition.T, uncorrelated_walks)
return correlated_walks不确定这对您有多大帮助,但是删除Python级别的循环应该是一种提升,因为它将减少多个numpy调用的开销。
你可以牺牲可读性,把整件事变成一条线:
def generate_random_correlated_walks(decomposition, x, n):
return np.dot(decomposition.T, nrand.normal(loc=0, scale=1, size=(2*x, n)))https://stackoverflow.com/questions/46674920
复制相似问题