删除N个随机对象的最快方法

时间:2017-07-10 16:47:20

标签: python-2.7 performance random

我的问题如下,我目前正在使用生成的长度为m的列表。然而,该列表应该是算法将n作为最终长度的参数的结果。 m总是比n大很多。目前我正在运行一个while循环,其中m是len(list)的结果。 即:

from numpy import random as rnd
m = 400000
n = 3000
list = range(0, m)
while len(list) > n:
    rmi = rnd.randint(0, len(list))
    del list[rmi]
    print('%s/%s' %(len(list), n))

这种方法确实有效,但需要很长时间才能运行。是否有更高效,更省时的方法从我的列表中删除m-n随机条目?删除的条目必须是随机的,否则结果列表将不再代表它应该是什么。

编辑: 稍后在我的代码中,我有两个大小为n的数组,需要缩短为b大小,这里需要注意的是两个列表都需要随机删除元素,但删除的元素也必须共享相同的索引。即:

from numpy import random as rnd
n = 3000
b = 500
list1 = range(0, n)
list2 = rnd.sample(xrange(10000), n)
while len(list1) > b:
    rmi = rnd.randint(0, len(list1))
    del list1[rmi]
    del list2[rmi]
    print('%s/%s' %(len(list1), b)

alvis'下面的回答回答了我的问题的第一部分,但它不适用于第二部分。

1 个答案:

答案 0 :(得分:3)

尝试numpy.random.choice,它会创建列表的随机样本:

https://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.random.choice.html

import numpy as np
...
np.random.choice(range(0,m), size=n)