【发布时间】:2021-03-10 17:19:49
【问题描述】:
当使用 pythons random.shuffle 函数时,我注意到使用 sorted(l, key=lambda _: random.random()) 比使用 random.shuffle(l) 快得多。据我了解,这两种方式都会产生完全随机的列表,那么为什么shuffle 需要这么长时间呢?
以下是使用timeit 模块的时间。
from timeit import timeit
setup = 'import random\nl = list(range(1000))'
# 5.542 seconds
print(timeit('random.shuffle(l)', setup=setup, number=10000))
# 1.878 seconds
print(timeit('sorted(l, key=lambda _: random.random())', setup=setup, number=10000))
【问题讨论】:
-
理想情况下,shuffle 函数实现Fisher–Yates shuffle,它具有 O(n) 运行时复杂度,而一般排序具有 O(n log n) 运行时复杂度。我怀疑
sorted(l, key=lambda _: random.random())不是洗牌数组的正确方法:请参阅提到的链接。 -
@user4642212:Python 是 Fisher-Yates(假设我正在正确阅读 Wikipedia 和
random.shuffle源代码)。该链接确实提到sorted和random.random()是正确的
标签: python performance random shuffle