相关疑难解决方法(0)

为什么洗牌 list(range(n)) 比洗牌 [0]*n 慢?

使用random.shuffle,我注意到 shufflelist(range(n))比 shuffle 多花费大约 25% 的时间[0] * n。以下是n100 万到 200 万大小的时间:

随机.shuffle(mylist)

为什么洗牌list(range(n))速度变慢?与对列表进行排序(需要查看对象)或复制列表(增加对象内部的引用计数器)不同,对象在这里不重要。这应该只是重新排列列表内的指针。

我也尝试过numpy.random.shuffle,其中洗牌list(range(n))比洗牌慢三倍(!)[0] * n

numpy.random.shuffle(mylist)

我还尝试了第三种方法来重新排列列表中的元素,即list.reverse. 正如预期的那样,两个列表花费的时间相同:

列表.reverse(mylist)

为了防止洗牌顺序很重要,我也在list.reverse洗牌后尝试过。同样,正如预期的那样,两个列表花费的时间相同,并且与没有事先进行改组的时间相同:

洗牌后的 list.reverse(mylist)

那么有什么区别呢?混排和反转都只需要重新排列列表内的指针,为什么对象对于混排很重要,而对于反转则不重要?

我的基准代码生成时间:

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 …
Run Code Online (Sandbox Code Playgroud)

python performance shuffle

3
推荐指数
1
解决办法
199
查看次数

标签 统计

performance ×1

python ×1

shuffle ×1