【发布时间】:2021-09-09 00:33:49
【问题描述】:
我开发了以下程序,用于为特定任务以块的形式生成子样本列表。但是,它非常慢,因为我在循环中进行随机采样。
import scipy.stats as stats
import numpy as np
#GENERATE SOME RANDOMLY CHUNKED COUNT DATA
N_chunks=250
idx_chunks = np.random.randint(20, size=N_chunks)
idx_cumsum = np.cumsum(idx_chunks)
data_sample = stats.poisson(mu=5).rvs(size=np.sum(idx_chunks))
data_sample_split = np.split(data_sample, idx_cumsum)[:-1]
#GENERATE SUBSAMPLES OF THE LENGTH GIVEN BY EACH ELEMENT OF THE LIST
f = stats.poisson(mu=2)
output = []
total = 0
for _i1 in data_sample_split:
temp = []
for _ii1 in _i1:
temp.append(f.rvs(_ii1))
output.append(temp)
有什么方法可以加快程序的速度,同时获得完全相同的输出?
我特别希望在重塑为列表列表之前对我需要的所有样本进行预采样。但是,我不知道该怎么做。
【问题讨论】:
-
大部分时间 (>95%) 都花在
f.rvs上。因此,您无能为力。如果使用多个 stats.poisson 对象生成部分结果在统计上很好,那么您可以使用并行性来加快处理速度(使用多处理)。否则,在这种情况下(通常是矢量化),只有使用低级语言的微优化可能会有所帮助(即用 C/C++ 重写rvs)。 -
我正在考虑以某种方式生成所需数量的样本并将其拆分,这往往会快得多。但是,np.split 只适用于一个级别:我需要做两个级别的拆分,我不知道如何实现它。
标签: performance numpy random scipy scipy.stats