Numpy 为什么对待a += b和a = a + b不同

Numpy 为什么对待a += b和a = a + b不同

Numpy 这个库是 Python 中用来进行科学计算的一个基础库,它可以大大提高 Python 对于数学计算的效率和处理速度,而在使用 Numpy 的过程中,我们可能会遇到一个问题,那就是在对于 Numpy 数组中进行简单运算符号 += 和 = 时,为什么结果会不一样,这是因为 Numpy 中针对于 += 和 = 的运算符重载不同所导致的。

阅读更多:Numpy 教程

+= 运算符的重载

在 Numpy 中进行 += 运算的时候,Numpy 会直接使用对应的 ndarray 的__iadd__方法进行重载,所以这时候的 += 运算就是对于原数组的部分操作了,比如代码:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5 ,6])

a += b
print(a)

输出结果是:

[5, 7, 9]

上面的代码中,我们可以看到 a += b 这个操作本质上就是将两个数组中对应的元素相加的结果,赋给了数组 a 的对应下标的位置。

这种行为使得 Numpy 在进行等式运算符号的时候,可以直接操作原数组,因此运行速度更快。

= 运算符的重载

当 Numpy 进行等号运算的时候,它其实重新创建了一个新的数组对象,将其赋值给等号运算符左边的变量。具体的重载会调用 __array_wrap____array_prepare__等方法,所以这时候此时的 = 就是在原数组上进行了重新创建后的覆盖操作,会导致一些性能瓶颈的出现。举个例子:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

a = a + b
print(a)

输出结果是:

[5, 7, 9]

由此可以看到,这种情况下 a 变成了一个新的数组,原有数据没有被修改。

推荐用 += 的原因

通过上面的分析,不难发现,使用 += 运算符时,Numpy 在原数组上进行操作时,比对原数组重新创建后重新赋值的性能消耗要少,所以在使用 Numpy 算法时,应该尽量使用 += 运算符从而提高算法效率。

总结

Numpy 中的 += 和 = 的运算符号是不同的,当进行 += 运算的时候,Numpy 是直接操作了原数组,但是当使用等号运算符时,Numpy 是重新创建了一个新数组来覆盖原数组,从而导致运行效率变低,因此建议在使用 Numpy 数组的时候尽量使用 += 运算符。不了解这些区别会让程序员花费更多的时间来调试代码并寻找相应的瓶颈。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程