为何np.random.choice运行速度远慢于np.random.randint?
np.random.choice 与 np.random.randint 的性能差异疑问
我看到资料称np.random.choice比np.random.randint更快,但对比以下两段代码的运行速度:
第一段代码:
import numpy as np for i in range(100000): np.random.choice(100)
第二段代码:
import numpy as np for i in range(100000): np.random.randint(100)
实际测试后发现np.random.randint明显更快,请问这两个函数的差异是什么?
核心差异解析
1. 功能定位与底层实现
np.random.randint是专门生成均匀分布整数的轻量函数,底层直接调用高效的整数随机生成器,逻辑简单,几乎无额外开销。当仅需[0, n)范围内的整数时,它是针对性优化的实现。np.random.choice是通用型采样工具,支持从任意一维数组(不仅是连续整数范围)中采样,还支持加权采样、无放回采样等复杂逻辑。即使仅传入整数n,它也会先创建0到n-1的临时数组,再从中采样,这一步额外的数组创建和索引操作会带来明显性能损耗。
2. 调用场景对性能的影响
你测试的是循环内单次调用的场景,这种情况下choice的临时数组初始化开销会被循环放大。但如果是批量生成大量随机数(直接指定size参数一次性生成),两者的性能差距会显著缩小:
# 批量生成100000个随机数的写法 np.random.choice(100, size=100000) np.random.randint(100, size=100000)
此时choice可以一次性完成数组创建与采样,避免了循环带来的Python层额外开销,性能表现会更接近randint。
3. 资料结论的适用前提
你看到的“choice比randint更快”的结论,通常是基于复杂采样场景:比如需要从非连续数组中采样,或者需要加权、无放回采样逻辑时,choice是原生支持这些功能的高效实现;而如果用randint模拟相同逻辑,需要额外编写大量代码,性能反而会更差。
内容的提问来源于stack exchange,提问作者Trahtorco
相关产品推荐
相关产品推荐

