【问题标题】:Performance of Random number generators of pyroot and randompyroot 和 random 随机数生成器的性能
【发布时间】:2021-03-11 18:32:39
【问题描述】:

我正在寻求优化一个简单的给定代码,该代码生成一个不在给定列表中的随机数 ([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 中的性能提升?

【问题讨论】:

  • 我觉得你的设置有点奇怪,所以你有一个号码室 I,它分为 I1 允许号码和 I2 禁止号码,你从 I 中抽取数字,直到你从 I2 中抽取一个?或者目标是什么?
  • 是的,就是这个想法。我从我的数字 [0,1,2] 中抽取,直到抽取一个不在我的第二个列表中的数字。由于这存在理论上无限运行时的问题,我编写了第二段代码,虽然我会更快,但由于某种原因,它只在 Windows 上而不是在 Linux 上。我想知道为什么它只在 Windows 上更快。
  • 我的回答能回答你的问题吗?

标签: python random pyroot


【解决方案1】:

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

random.choice 被实现为:

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

更多关于第二个答案here

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

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

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

【讨论】:

  • 谢谢,但你知道为什么 Windows 和 Linux 的运行时不同吗?
  • 您用来测试运行时的样本有多大?
  • 我测试了 100000 次 getNumber([], generator) getNumber([1], generator) getNumber([1,2], generator) getNumber([numberOne], generator) getNumber([numberOne], [numberTwo], generator) 所以我有足够大的样本量。在我的 Windows 机器上,bessereAuswahl() 的运行时间约为 0.5 秒,getNumber() 的运行时间约为 0.7 秒。在 Linux 上,bessereAuswahl() 为 2.9s,getNumber() 为 2.2s。
  • windows 和 Linux 都部署在裸机上还是一个作为 vm 在另一个中部署?
  • 好吧,你的测试环境看起来绝对没问题,所以很遗憾我没有其他想法......对不起伙计
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 2020-06-05
  • 2012-08-07
  • 2020-03-02
相关资源
最近更新 更多