random.shuffle(x)和random.sample(x,len(x))之间的时间/空间差异是什么?

时间:2015-11-02 10:53:27

标签: python random

我经常遇到"洗牌"一个类似于使用sorted函数的python列表,即返回列表的混乱副本而不改变原始函数。

我知道可以对列表进行浅层复制,然后shuffle

a = [random.randint(1, 1000) for _ in xrange(100)]
b = a[:]
random.shuffle(b)

我的函数式程序员想要一个不变的解决方案(并且适合单个可读行是一个很大的好处),所以我想使用sample函数:

a = [random.randint(1, 1000) for _ in xrange(100)]
b = random.sample(a, len(a))

然而,在文档中没有任何地方可以找到线索,无论是时间和空间,渐近还是常数因素,这是否是一个好主意。

帖子What is the difference between random.sample and random.shuffle in Python似乎在问一个类似的更广泛的问题,但a)没有一个公认的答案,更重要的是,b)没有一个答案提供任何相关的优点是什么时间/空间条款。

所有4个答案除了最多投票的答案之外,特别谈论输出,而不是任何算法的复杂性。

最投票的答案包含两个函数的python源代码,并得出结论:

  

随机化主要由行int(random() * n)完成。因此,基础算法基本相同

我认为这表明输出是相同的,但就时间复杂性而言,它并没有真正解决问题,因为周围的代码有很大不同。

所以我的问题是:什么是时间/空间成本差异,最好是渐近和常数因素,在浅层副本random.shufflerandom.sample(x, len(x))之间?

NB 我认为标题稍微不准确,因为它没有明确表示我想要比较random.shuffle(x),其中x已经是浅拷贝了。这纯粹是因为需要简洁。

0 个答案:

没有答案