random.shuffle
函数,我发现对于需要打乱的列表list(range(n))
,打乱所需的时间比打乱[0] * n
的时间多大约25%。以下是在n
大小从100万到200万时的时间统计:
![random.shuffle(mylist)](https://istack.dev59.com/zOZ4w.webp)
list(range(n))
会更慢?和排序一个列表(需要查看对象)或复制一个列表(增加了对象内部的引用计数)不同,这里不应该考虑对象。这应该只是重新排列列表内部的指针。我还尝试了使用
numpy.random.shuffle
函数,其中打乱list(range(n))
比打乱[0] * n
慢3倍(!):
![numpy.random.shuffle(mylist)](https://istack.dev59.com/nuR49.webp)
list.reverse
。结果对于两个列表来说都需要相同的时间:
![list.reverse(mylist)](https://istack.dev59.com/FKTF5.webp)
list.reverse
。同样,对于两个列表来说都需要相同的时间,并且与之前未进行打乱时所需时间相同:
![list.reverse(mylist) after shuffling](https://istack.dev59.com/PoZX8.webp)
以下是我的基准测试代码:
import random
import numpy
from timeit import repeat, timeit
from collections import defaultdict
shufflers = {
'random.shuffle(mylist)': random.shuffle,
'numpy.random.shuffle(mylist)': numpy.random.shuffle,
'list.reverse(mylist)': list.reverse,
}
creators = {
'list(range(n))': lambda n: list(range(n)),
'[0] * n': lambda n: [0] * n,
}
for shuffler in shufflers:
print(shuffler)
for creator in creators:
print(creator)
times = defaultdict(list)
for _ in range(10):
for i in range(10, 21):
n = i * 100_000
mylist = creators[creator](n)
# Uncomment next line for pre-shuffling
# numpy.random.shuffle(mylist)
time = timeit(lambda: shufflers[shuffler](mylist), number=1)
times[n].append(time)
s = '%.6f ' * len(times[n])
# Indent next line further to see intermediate results
print([round(min(times[n]), 9) for n in sorted(times)])
random.shuffle
的源代码了吗? - DisappointedByUnaccountableMod