gpt4 book ai didi

python - 为什么使用 numpy.nonzero 比循环 numpy 数组要快得多?

转载 作者:行者123 更新时间:2023-11-30 22:02:11 24 4
gpt4 key购买 nike

让我们创建一个包含 1000 万个 bool 值的 numpy ndarray,所有值都初始化为 True

n=10000000
sample = np.ones(n, dtype=bool)

接下来我们将一些值设置为 False

sample[1] = sample[5] = sample[12] = sample[25] = sample[50] = False

True 值的数量现在为 n-5 = 9999995

我们可以通过循环数组或使用 np.nonzero 来计算真值的数量

第一种方法在我的 MacBook 上大约需要 30 秒,如

    !date
sum=0
for i in range(n):
if sample[i] == True:
sum=sum+1
print(sum)
!date

Thu Dec 20 01:31:34 EST 2018
9999995
Thu Dec 20 01:32:02 EST 2018

而第二种方法只需不到一秒

!date
print(len(np.zero(sample)[0]))
!date

Thu Dec 20 01:33:05 EST 2018
9999995
Thu Dec 20 01:33:05 EST 2018

当数组为 10 亿个 bool 值时,同样不到一秒,而循环需要大约半小时。

为什么会有如此巨大的差异? numpy.nonzero 方法是否以某种方式维护 len 能够访问的一些元数据?

最佳答案

你的第一个样本有一个Python循环,在每次迭代中,需要从numpy数组中的低级 bool 值(1字节)构造一个Python bool 对象(28字节),然后(除非Python比Python更聪明)我认为是的)另一个 bool 值被构造来保存 bool 值与 True 的无用比较的结果。 (无用,因为 if x: 始终与 if x == True: 相同,因为 x 是 bool 值)。还有关于您的计数器的计算正在进行,i .

您的第二个示例几乎完全在 native 代码中发生,而不是在 Python 中。隐式循环是用低级语言编码的,递增其计数器是单个机器代码指令,数据访问就像可以想象的一样直接。您只需进入 Python 几次:一次是将新构造的数组包装在 np.zero 末尾的 Python 对象中。 ,一次构造 len 结果的 Python 整数.

这是唯一的区别:Python 与原生。

关于python - 为什么使用 numpy.nonzero 比循环 numpy 数组要快得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53864394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com