如何最快生成0到指定数值的打乱索引数组?
生成0到指定数值的打乱索引数组的最优方法
你当前用的arange+shuffle方法已经比choice高效很多,但确实存在更直接且性能更优的实现方式:
推荐方法1:使用rng.permutation()
numpy.random.Generator.permutation()可以直接生成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" test3 = "matrix[0][:] = rng.permutation(idxlen)" print(timeit.timeit(test1, setup, number=10000)) print(timeit.timeit(test3, setup, number=10000))
典型计时结果(仅供参考,具体数值取决于硬件):
0.1821 0.1457
推荐方法2:直接在目标切片上原地打乱
如果想彻底避免中间数组的创建,可以直接在目标矩阵的切片上先赋值有序数组,再原地打乱,减少内存拷贝开销:
test4 = "matrix[0][:] = np.arange(idxlen); rng.shuffle(matrix[0])"
该方法的性能和permutation接近,在部分场景下甚至更优。
性能差异原因
rng.permutation()针对整数范围场景做了优化,直接生成打乱序列,无需先创建有序数组再打乱,减少了一次数组赋值操作。- 直接操作目标切片的方式省去了中间变量的内存占用,原地修改的开销更低。
rng.choice(..., replace=False)需要处理通用的非连续采样场景,内部逻辑更复杂,因此性能差距明显。
内容的提问来源于stack exchange,提问作者HTF-struggle
相关产品推荐
相关产品推荐

