我正在尝试找到生成随机索引数组的最快方法。可以这么说,从 0 到数字的随机范围。
目前我比较了这两种方法:
setup = "import numpy as np; idxlen = 1000; rng = np.random.default_rng(); matrix = -np.ones([100,idxlen],dtype=int)"
test1 = "rand_idxs = np.arange(idxlen);
rng.shuffle(rand_idxs);
matrix[0][:] = rand_idxs"
test2 = "matrix[0][:] = rng.choice(range(idxlen),idxlen,replace=False)"
print(timeit.timeit(test1, setup, number = 10000))
print(timeit.timeit(test2, setup, number = 10000))
返回以下时间:
0.1846354000736028
0.950088300043717
我假设在幕后, rng.shuffle() 方法会随机化过去数组的索引,并根据这些索引重新排列它。现在,由于我正在生成一个包含从 0 到某个数字的每个整数的数组,因此这实际上对应于生成随机索引。因此,我无法摆脱这样的感觉:有一种更快的方法可以实现我想要实现的目标。有吗
如果您从测试二中删除范围,那么您会看到变化并发现
test2
比第一个更快
import timeit
setup = "import numpy as np; idxlen = 1000; rng = np.random.default_rng(); matrix = -np.ones([100,idxlen],dtype=int)"
test1 = "rand_idxs = np.arange(idxlen); rng.shuffle(rand_idxs); matrix[0][:] = rand_idxs"
test2 = "matrix[0][:] = rng.choice(idxlen,idxlen,replace=False)"
print(timeit.timeit(test1, setup, number = 10000))
print(timeit.timeit(test2, setup, number = 10000))
现在进行测试
对于 idxlen=1000
0.15045420000024023
0.24143790000016452
对于 idxlen=10000
1.4334205999984988
1.3395810999973037
对于 idxlen=100000
14.489788099999714
8.599601199999597