You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何最快生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:20:24