【发布时间】:2020-11-20 14:42:36
【问题描述】:
如果我评估类似:
numpy.random.choice(2, size=100000, p=[0.01, 0.99])
使用一个均匀分布的随机float,比如r,并确定r < 0.01 是否会浪费许多生成的随机位(熵)。我听说(二手)生成伪随机数的计算成本很高,所以我认为numpy 不会这样做,而是在这种情况下使用像arithmetic coding 这样的方案。
然而,起初glance 似乎choice 确实为它所要求的每个样本生成了一个float。此外,一个快速的timeit 实验表明,生成n 统一浮点数实际上比来自p=[0.01, 0.99] 的n 样本更快。
>>> timeit.timeit(lambda : numpy.random.choice(2, size=100000, p=[0.01, 0.99]), number=1000)
1.74494537999999
>>> timeit.timeit(lambda : numpy.random.random(size=100000), number=1000)
0.8165735180009506
choice 真的会为每个样本生成一个float,就像它看起来的那样吗?在某些情况下(尤其是size 很大且p 分布不均匀时)使用某些压缩算法不会显着提高性能吗?如果没有,为什么不呢?
【问题讨论】:
-
python 的一大优点是大多数软件包都可以很容易地作为开源找到,因此您可以轻松地调查这些问题,似乎您已经回答了自己的问题,但是你可以确切地看到 numpy.random.choice 是如何实现的@@github.com/numpy/numpy/blob/master/numpy/random/mtrand.pyx#L805
-
也许我应该编辑标题。问题实际上是为什么生成比您需要的更多的随机位有意义。
-
这似乎是一个很好的问题,您应该在上面列出的 gitlab 上提交并将 MR 提交给 numpy for :)... 然后您甚至可以说您为数百万(可能是数百万)使用的软件包做出了贡献...也许只有 100 的数千)
-
@JoranBeasley :) 好的。我只是希望一些更聪明的人会指出我上面推理中的错误
-
老实说,我不知道……就我而言,随机数接近于一个神奇的黑匣子……而且对我来说似乎“足够快”
标签: python python-3.x performance numpy random