我想找到最快的方法来在python / numpy中生成〜10 ^ 9个泊松随机数-例如,假设我有一个形状为(1000,2000)的平均泊松参数(在其他地方计算),我需要500独立样本。这是我代码中的瓶颈,需要几分钟才能完成。我尝试了三种方法,但是正在寻找更快的方法:
import numpy as np
# example parameters
nsamples = 500
nmeas = 2000
ninputs = 1000
lambdax = np.ones([ninputs, nmeas]) * 20
# numpy, one big array
sample0 = np.random.poisson(lam=lambdax, size=(nsamples, ninputs, nmeas))
# numpy, current version where other code happens in the loop
sample1 = np.zeros([nsamples, ninputs, nmeas])
for i in range(nsamples):
sample1[i, :, :] = np.random.poisson(lam=lambdax)
# scipy
from scipy.stats import poisson
sample2 = poisson.rvs(lambdax, size=(nsamples, ninputs, nmeas))
结果:
sample0: 1 m 16 s
sample1: 1 m 20 s
sample2: 1 m 50 s
这里未显示,我也通过multiprocessing
并行化独立样本,但是对于如此大的参数,计算仍然非常昂贵。有更好的方法吗?
我去过你的鞋子,这是我的建议:
sample0
方法放在首位。现在,根据您要对随机数执行的操作,sample0
保存到文件中,并在下次运行时重新加载。 sample0
中的许多随机数将在您的样本中重复出现。您可能想要创建较小的样本大小并从中随机选择。例如,我会从sample0
中选择一个随机数,然后将其重复使用,例如100次(因为该数字无论如何都会在sample0
中出现超过100次)。如果您提供有关您打算如何处理随机数的更多信息,我们可能会提供更多帮助。否则,我不确定是否可以做得更多。