M45*_*00R 1 python arrays numpy matrix linear-algebra
我对为什么这段代码感到困惑:
start = time.time()
for i in range(1000000):
_ = 1 - np.log(X)
print(time.time()-start)
Run Code Online (Sandbox Code Playgroud)
比此实现更快地执行:
start = time.time()
for i in range(1000000):
_ = np.subtract(np.ones_like(X), np.log(X))
print(time.time()-start)
Run Code Online (Sandbox Code Playgroud)
我的理解是,这应该是相反的,因为在第二种实现中,我利用了向量化提供的加速,因为它能够同时操作X中的元素,而不是顺序地进行操作,这就是我假定的第一种实现功能。
我真的很困惑,有人可以帮我一下吗?谢谢!
代码的两个版本均被矢量化。您创建的尝试向量化第二个版本的数组只是开销。
NumPy矢量化不指硬件矢量化。如果编译器足够聪明,则可能最终会使用硬件矢量化,但是NumPy不会明确使用AVX或其他任何东西。
NumPy向量化是指编写一次可在整个数组上运行的Python级代码,而不是使用一次可在多个操作数上运行的硬件指令。它是Python级别的矢量化,而不是机器语言级别的矢量化。与编写显式循环相比,这样做的好处是NumPy可以在C级循环中执行工作,而不是在Python中进行操作,从而避免了大量的动态分派,装箱,拆箱,通过字节码评估循环的过程等。
从这个意义上来说,两种版本的代码都是矢量化的,但是第二种版本在写入和读取大量的代码时浪费了大量的内存和内存带宽。
同样,即使我们在谈论硬件级矢量化,该1 -版本也将与其他版本一样适用于硬件级矢量化。您只需将标量加载1到向量寄存器的所有位置,然后照常进行即可。与第二个版本相比,它往返于内存的传输要少得多,因此运行速度可能仍然比第二个版本快。