Skip to main content
 首页 » 编程设计

python之与使用两个 Numpy 数组进行矢量化相比,为什么使用 Numpy 数组和 int 进行算术运算时减法更快

2025年05月04日18小虾米

我很困惑为什么这段代码:

start = time.time() 
for i in range(1000000): 
    _ = 1 - np.log(X) 
print(time.time()-start) 

比这个实现执行得更快:

start = time.time() 
for i in range(1000000): 
    _ = np.subtract(np.ones_like(X), np.log(X)) 
print(time.time()-start) 

我的理解是它应该是相反的,因为在第二个实现中我利用了矢量化提供的加速,因为它能够同时操作 X 中的元素而不是按顺序进行,这就是我的假设第一个实现函数。

有人可以为我阐明这一点吗,因为我真的很困惑?谢谢!

请您参考如下方法:

您的代码的两个版本都同样矢量化。您为尝试矢量化第二个版本而创建的数组只是开销。


NumPy 向量化不是指硬件向量化。如果编译器足够聪明,它最终可能会使用硬件矢量化,但 NumPy 并未明确使用 AVX 或任何东西。

NumPy 向量化是指编写一次对整个数组进行操作的 Python 级代码,而不是使用一次对多个操作数进行操作的硬件指令。它是 Python 级别的矢量化,而不是机器语言级别的矢量化。与编写显式循环相比,这样做的好处是 NumPy 可以在 C 级循环而不是 Python 中执行工作,从而避免了大量的动态调度、装箱、拆箱、字节码评估循环等。

从这个意义上说,您的两个版本的代码都是矢量化的,但第二个版本在写入和读取大量数组时浪费了大量内存和内存带宽。

此外,即使我们谈论的是硬件级矢量化,1 - 版本也与其他版本一样适用于硬件级矢量化。您只需将标量 1 加载到向量寄存器的所有位置,然后照常进行。与第二个版本相比,它涉及的内存传输和内存传输要少得多,因此仍然可能比第二个版本运行得更快。