python - 选择的性能与 randint

标签 python performance random

我想在 ab 之间选择一个随机整数,包括在内。

我知道 3 种方法。然而,他们的表现似乎非常违反直觉:

import timeit

t1 = timeit.timeit("n=random.randint(0, 2)", setup="import random", number=100000)
t2 = timeit.timeit("n=random.choice([0, 1, 2])", setup="import random", number=100000)
t3 = timeit.timeit("n=random.choice(ar)", setup="import random; ar = [0, 1, 2]", number=100000)

[print(t) for t in [t1, t2, t3]]

在我的机器上,这给出了:

0.29744589625620965
0.19716156798482648
0.17500512311108346

使用 online interpreter ,这给出:

0.23830216699570883
0.16536146598809864
0.15081614299560897

请注意,使用专用函数来完成我正在做的事情的最直接版本 (#1) 比预定义数组的最奇怪版本 (#3) 差 50%然后从中随机选择。

这是怎么回事?

最佳答案

这只是实现细节。 randint代表randrange ,所以它有另一层函数调用开销,并且 randrange 经历了大量的参数检查和其他 crud。相比之下,choice是一个非常简单的单行代码。

这是此调用经过的代码路径 randint,删除了注释和未执行的代码:

def randint(self, a, b):
    return self.randrange(a, b+1)

def randrange(self, start, stop=None, step=1, _int=int, _maxwidth=1L<<BPF):
    istart = _int(start)
    if istart != start:
        # not executed
    if stop is None:
        # not executed

    istop = _int(stop)
    if istop != stop:
        # not executed
    width = istop - istart
    if step == 1 and width > 0:
        if width >= _maxwidth:
            # not executed
        return _int(istart + _int(self.random()*width))

这是 choice 经过的代码路径:

def choice(self, seq):
    return seq[int(self.random() * len(seq))]

关于python - 选择的性能与 randint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29574605/

相关文章:

javascript - VueJs 在一次更改后呈现所有元素

c++ - 与 Mathematica 相比,C++ 中的 float 学舍入很奇怪

java - 使用随机物体模拟 2 个骰子,直到掷出 2 或 12

python - python中yield值存储在哪里

python - 了解 statsmodels grangercausalitytests 的输出

python - z3py 示例不适用于 macOS

performance - 用于分片 + 冗余 MongoDB 环境的硬件

python - 如何使用请求从链接收集数据并将数据移动到 pandas Dataframe

c++ - Introsort (quicksort + heapsort) 实现和复杂度

c++ - 二维网格中的不同随机点