gpt4 book ai didi

python - 为什么生成随机整数的 "normal"方法这么慢?

转载 作者:太空狗 更新时间:2023-10-30 02:57:19 25 4
gpt4 key购买 nike

我不是数学专业或 CS 专业,我只是在玩 python(通常为视频游戏的模拟/理论制作编写脚本),我发现 random.randint 的性能有多糟糕。这让我想知道为什么 random.randint 或 random.randrange 被使用/制作成它们现在的样子。我做了一个函数,它产生(出于所有意图和实际目的)与 random.randint 相同的结果:

big_bleeping_float= (2**64 - 2)/(2**64 - 2)
def fastrandint(start, stop):
return start + int(random.random() * (stop - start + big_bleeping_float))

与下一个最快的方法 random.randrange(0, 66) 相比,使用它生成 0-65 范围内(含)整数的速度大幅提升了 180%。

>>> timeit.timeit('random.randint(0, 66)', setup='from numpy import random', number=10000)
0.03165552873121058

>>> timeit.timeit('random.randint(0, 65)', setup='import random', number=10000)
0.022374771118336412

>>> timeit.timeit('random.randrange(0, 66)', setup='import random', number=10000)
0.01937231027605435

>>> timeit.timeit('fastrandint(0, 65)', setup='import random; from fasterthanrandomrandom import fastrandint', number=10000)
0.0067909916844523755

此外,将此函数改编为 random.choice 的替代方法的速度提高了 75%,而且我确信添加大于 1 的步进范围会更快(尽管我没有对此进行测试)。与使用 fastrandint 函数相比,速度提升几乎翻倍,您可以简单地将其内联编写:

>>> timeit.timeit('int(random.random() * (65 + big_bleeping_float))', setup='import random; big_bleeping_float= (2**64 - 2)/(2**64 - 2)', number=10000)
0.0037642723021917845

所以总而言之,为什么我认为我的函数更好是错误的,如果它更好为什么它会更快,还有没有更快的方法来完成我正在做的事情?

最佳答案

randint电话 randrange它进行一系列范围/类型检查和转换,然后使用 _randbelow生成一个随机整数。 _randbelow 再次进行一些范围检查,最后使用 random .

因此,如果您删除所有边缘情况检查和一些函数调用开销,那么您的 fastrandint 会更快也就不足为奇了。

关于python - 为什么生成随机整数的 "normal"方法这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37536868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com