【问题标题】:random.shuffle very slow in Python 3 with list在 Python 3 中 random.shuffle 非常慢,带有列表
【发布时间】:2019-04-22 01:16:13
【问题描述】:

我正在使用 python-3.x,我正在尝试生成索引编号列表并将它们打乱以便稍后使用它们从样本中选择随机值,其中该样本将具有两个变量样本大小和维度编号,但是在这里我如何生成索引列表以及我将它们打乱:

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,也需要很长时间才能给出结果,这需要很长时间或者不会继续。

有什么方法可以加快速度?

因为我有一个包含值的多维样本,我想根据 all_indexes 从该样本中选择随机数量的值...

【问题讨论】:

  • 您正在生成一个包含 75287520 个元素的列表以进行随机播放 - 这可能不会很快...您是否确实需要为您想要实现的目标执行此操作?
  • 是的,我需要 20 个维度来解决我的问题,而不是 5 个,我感谢我做的方式不正确。
  • 是的,您绝对应该重新考虑您的方法。即使没有随机播放,这也会在你达到 20 个维度之前耗尽你的内存。
  • 是列表创建消耗了整个时间。一些生成器方式可能会更快。
  • @Austin 我有同样的想法并对其进行了测试。 shuffle 比创建列表花费的时间要长很多。

标签: python-3.x list random shuffle


【解决方案1】:

正如 cmets 中所指出的,您正在生成一个非常大的列表,然后对其进行洗牌。这不会很快,但根据您的实际需要,可能会有更快的方法来获得您想要的。

我在我的机器上运行你的代码,发现生成所有组合的列表大约需要8秒,洗牌大约需要75秒。如果需要增加维度,这个时间会显着增加,更不用说内存需求了存储非常大的数组可能会开始变得重要。

如果你不需要所有的随机索引,你最好每次使用都采样,

random.sample(range(sample_size), dimension)

这会返回从0sample_size 的不同dimension 元素的随机集合。使用 dimensionsample_size 的值运行大约需要 0.0001 秒。如果您不需要太多随机值,那么每次生成一个新值会更快(并且内存效率更高)。

我可以看到这有两个问题。首先,您不能保证每个新样本都不会重复之前的样本,但是可以通过随时存储它们并检查它们是否已经使用过来轻松解决。

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))

【讨论】:

  • 非常感谢您的好评,问题知道是的,我需要索引的所有随机数,这意味着如果我的 sample_size 为 10,那么我需要 10 个随机数的索引 [( 0, 2), (0, 1),....... 如果维度是 2
  • 最后,我使用这个random_indexx = random.sample ( all_indexes, sample_size ) 来选择与我这样做的 sample_size 相当的索引的随机数,因为我想确保我不会有任何重复
  • 那很好,那你肯定比抽样更好。如果您只需要sample_size 样本,那么您不需要所有all_indexes。以dimension = 2sample_size = 10 为例,all_indexes 的大小将为 45。在原始示例中,sample_size 为 100,但 all_indexes 的大小为 75287520。
猜你喜欢
  • 2014-10-21
  • 2017-08-31
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 2018-01-01
  • 2014-10-25
相关资源
最近更新 更多