为什么random.choices比NumPy快;什么是随机选择?

为什么random.choices比NumPy快;什么是随机选择?,numpy,random,Numpy,Random,在Python中,我试图以最有效的方式进行随机采样,但是,我感到困惑,因为使用numpy的random.choices()比使用random.choices()慢 23秒vs 152毫秒是很长的时间 我做错了什么?这里有两个问题。首先,对于纯Pythonrandom库,您可能想使用sample而不是choices来进行采样而不进行替换。这在一定程度上改变了基准。其次,np.random.choice在无需替换的情况下具有更好的采样性能。这是一个已知的与随机生成器相关的API。您可以使用np.ra

在Python中,我试图以最有效的方式进行随机采样,但是,我感到困惑,因为使用numpy的random.choices()比使用random.choices()慢

23秒vs 152毫秒是很长的时间


我做错了什么?这里有两个问题。首先,对于纯Python
random
库,您可能想使用
sample
而不是
choices
来进行采样而不进行替换。这在一定程度上改变了基准。其次,
np.random.choice
在无需替换的情况下具有更好的采样性能。这是一个已知的与随机生成器相关的API。您可以使用
np.random.Generator
来获得更好的性能。我的时间安排:

%timeit meansample = [ np.mean( np.random.choice( s, samplesize, replace=False)) for _ in range(500)]
# 1 loop, best of 3: 12.4 s per loop

%timeit meansample = [np.mean(random.choices(s, k=samplesize)) for x in range(0,500)]
# 10 loops, best of 3: 118 ms per loop

sl = s.tolist()
%timeit meansample = [np.mean(random.sample(sl, k=samplesize)) for x in range(0,500)]
# 1 loop, best of 3: 219 ms per loop

g = np.random.Generator(np.random.PCG64())
%timeit meansample = [ np.mean( g.choice( s, samplesize, replace=False)) for _ in range(500)]
# 10 loops, best of 3: 25 ms per loop

因此,在没有替换的情况下,
random.sample
的性能优于
np.random.choice
但比
np.random.Generator.choice
random.choices
允许重复,而
np.random.choice(…,replace=False)
则不然,但是
np.random.choice
确实有性能更好的替代品,而不需要替换。@hilberts\u酗酒问题我们在谈论什么替代品?好吧,OP要求的是
replace=False
案例,这比
random.choices
慢,但这是两件不同的事情。而使用
replace=True
,则与
random相同。选择
更快。因此,比较类似功能时的问题并不成立。@Divakar我同意
random.choices
可能意味着
random.sample
。然而,
random.sample
在没有替换的情况下确实优于
np.random.choice
。如果使用
np.random.Generator.choice
而不是
np.random.choice
numpy
会更快。
%timeit meansample = [ np.mean( np.random.choice( s, samplesize, replace=False)) for _ in range(500)]
# 1 loop, best of 3: 12.4 s per loop

%timeit meansample = [np.mean(random.choices(s, k=samplesize)) for x in range(0,500)]
# 10 loops, best of 3: 118 ms per loop

sl = s.tolist()
%timeit meansample = [np.mean(random.sample(sl, k=samplesize)) for x in range(0,500)]
# 1 loop, best of 3: 219 ms per loop

g = np.random.Generator(np.random.PCG64())
%timeit meansample = [ np.mean( g.choice( s, samplesize, replace=False)) for _ in range(500)]
# 10 loops, best of 3: 25 ms per loop