1

我正在寻找优化一个简单的给定代码,该代码生成一个不在给定列表中的随机数([0,1,2])。随机数生成器是来自 ROOT 的 TRandom3。

def getNumber(noList, randomgen):
    #Fügen Sie hier Ihren Code ein!: 
    i = randomgen.Integer(3)
    while i in noList:
        i = randomgen.Integer(3)
    return i

这是非常基本的,只会生成新数字,直到达到允许的数字。

我自己优化的代码如下所示:

def bessereAuswahl(noList):
    return random.choice([elem for elem in [0,1,2] if elem not in noList])

我只是从列表 [0,1,2] 中删除所有不允许的数字,然后使用 random.choice 选择一个元素。

在 Windows 10 上运行我的性能有所提高,在 linux 上运行相同的代码我的性能有所下降。

为什么会这样?

linux 上的 random 是否存在隐藏的性能损失,还是 pyroot 的性能提升?

4

1 回答 1

0

所以这是一个实现和复杂性的问题:

random.choice 实现为:

The complexity of random.choice(list) is O(log n) where n is the number of elements in the list.

更多关于第二个答案的信息

而使用 Mersenne Twister 算法生成随机整数是O(1),源代码在这里

所以答案的第一部分是,渐近地choice更慢。但是,问题是,如果您必须生成一定数量的数字。

因此,如果您必须创建 n 个数字,并且总集合中允许的数字集合相对较小,那么重试次数可能会比单独的抽奖运行时间增长得更多

于 2020-11-29T18:22:15.647 回答