random.shuffle 在 Python 3 列表中非常慢
random.shuffle very slow in Python 3 with list
我正在使用 python-3.x,并且我正在尝试生成一个索引编号列表并将它们打乱以便稍后使用它们以 select 来自样本的随机值,其中这个样本将有两个变量样本大小和维度数,但是在这里我如何生成索引列表并将它们打乱:
dimension = 5
sample_size = 100
generate_indexes = itertools.combinations(range(sample_size),dimension)
all_indexes = list(generate_indexes)
# here I do the shuffle
random.shuffle(all_indexes)
我增加维数时的问题需要很长时间才能给出结果即使维数是5也需要很长时间或者不会进行。
有什么方法可以让它变快吗?
因为我有一个包含值的多维样本,我想 select 根据 all_indexes...
正如评论中所指出的,您正在生成一个非常大的列表,然后对其进行洗牌。这不会很快,但根据您的实际需要,可能有更快的方法来获得您想要的东西。
我运行你的代码在我的机器上,发现生成所有组合的列表大约需要8秒,洗牌大约需要75。如果你需要增加维度,这个时间会显着增加,更不用说存储非常大的数组的内存需求可能会开始变得显着。
如果您不需要所有 运行dom 索引,最好每次都使用
进行采样
random.sample(range(sample_size), dimension)
这个 returns 一个 运行dom 集合,包含从 0
到 sample_size
的不同 dimension
元素。使用您的值 dimension
和 sample_size
,这花费了大约 0.0001 秒到 运行。如果你不需要太多的 运行dom 值,那么每次生成一个新值会更快(并且内存效率更高)。
我发现有两个问题。首先,您不能保证每个新样本都不会重复前一个样本,但这可以通过随时存储它们并检查它们是否已被使用来轻松解决。
new_sample = random.sample(range(sample_size), dimension)
if new_sample not in random_indexes:
random_indexes.append(new_sample)
else:
# Handle this however you need.
这确实会增加 运行 时间,但如果您不需要太多样本,速度会更快。
另一个区别是您使用的方法生成的元素元组始终排序,因此 (1,2,3,4,5) 将是 all_indexes
的元素,但是 (5, 4,3,2,1) 不会。使用 random.sample
可以按任何顺序生成它们,因此两者都可能发生。如果这是一个问题,那么您将必须解决这个问题。也许在将它们添加到列表之前将它们放入一个集合中:
new_sample = set(random.sample(range(sample_size), dimension))
我正在使用 python-3.x,并且我正在尝试生成一个索引编号列表并将它们打乱以便稍后使用它们以 select 来自样本的随机值,其中这个样本将有两个变量样本大小和维度数,但是在这里我如何生成索引列表并将它们打乱:
dimension = 5
sample_size = 100
generate_indexes = itertools.combinations(range(sample_size),dimension)
all_indexes = list(generate_indexes)
# here I do the shuffle
random.shuffle(all_indexes)
我增加维数时的问题需要很长时间才能给出结果即使维数是5也需要很长时间或者不会进行。
有什么方法可以让它变快吗?
因为我有一个包含值的多维样本,我想 select 根据 all_indexes...
正如评论中所指出的,您正在生成一个非常大的列表,然后对其进行洗牌。这不会很快,但根据您的实际需要,可能有更快的方法来获得您想要的东西。
我运行你的代码在我的机器上,发现生成所有组合的列表大约需要8秒,洗牌大约需要75。如果你需要增加维度,这个时间会显着增加,更不用说存储非常大的数组的内存需求可能会开始变得显着。
如果您不需要所有 运行dom 索引,最好每次都使用
进行采样random.sample(range(sample_size), dimension)
这个 returns 一个 运行dom 集合,包含从 0
到 sample_size
的不同 dimension
元素。使用您的值 dimension
和 sample_size
,这花费了大约 0.0001 秒到 运行。如果你不需要太多的 运行dom 值,那么每次生成一个新值会更快(并且内存效率更高)。
我发现有两个问题。首先,您不能保证每个新样本都不会重复前一个样本,但这可以通过随时存储它们并检查它们是否已被使用来轻松解决。
new_sample = random.sample(range(sample_size), dimension)
if new_sample not in random_indexes:
random_indexes.append(new_sample)
else:
# Handle this however you need.
这确实会增加 运行 时间,但如果您不需要太多样本,速度会更快。
另一个区别是您使用的方法生成的元素元组始终排序,因此 (1,2,3,4,5) 将是 all_indexes
的元素,但是 (5, 4,3,2,1) 不会。使用 random.sample
可以按任何顺序生成它们,因此两者都可能发生。如果这是一个问题,那么您将必须解决这个问题。也许在将它们添加到列表之前将它们放入一个集合中:
new_sample = set(random.sample(range(sample_size), dimension))