我正在尝试以最高效的方式在Python中进行随机抽样,但我感到困惑,因为使用numpy的random.choices()比使用random.choices()要慢。
import numpy as np
import random
np.random.seed(12345)
# use gamma distribution
shape, scale = 2.0, 2.0
s = np.random.gamma(shape, scale, 1000000)
meansample = []
samplesize = 500
%timeit meansample = [ np.mean( np.random.choice( s, samplesize, replace=False)) for _ in range(500)]
23.3 s ± 229 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit meansample = [np.mean(random.choices(s, k=samplesize)) for x in range(0,500)]
152 ms ± 324 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
23秒与152毫秒的时间差很大
我做错了什么?
random.choices
允许重复,而np.random.choice( ..., replace=False)
则不允许。 - Divakarnp.random.choice
有更好的无重复元素的替代方案。 - hilberts_drinking_problemreplace=False
的情况,这比random.choices
慢,但这是两个不同的事情。而对于replace=True
,它与random.choices
相同且更快。因此,在比较类似功能时,这个问题并不成立。 - Divakarrandom.choices
可能应该是random.sample
。然而,random.sample
在不重复的情况下表现更好,如果使用np.random.Generator.choice
而不是np.random.choice
,则numpy
的速度会更快。 - hilberts_drinking_problem