为什么NumPy数组这么快?
我刚刚把我写的一个程序改成用numpy数组来存储数据,因为之前运行速度很慢,结果差别真是太大了。原来运行需要30分钟,现在只要2.5秒!
我在想这是怎么做到的。我猜可能是因为它不需要用到for
循环,但除此之外我就不知道了。
6 个回答
5
考虑以下代码:
import numpy as np
import time
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a, b)
toc = time.time()
print("Vectorised version: " + str(1000*(toc-tic)) + "ms")
c = 0
tic = time.time()
for i in range(1000000):
c += a[i] * b[i]
toc = time.time()
print("For loop: " + str(1000*(toc-tic)) + "ms")
输出结果:
Vectorised version: 2.011537551879883ms
For loop: 539.8685932159424ms
这里,Numpy的速度快很多,因为它利用了并行处理的优势(这就是所谓的单指令多数据,简称SIMD),而传统的for循环无法做到这一点。
27
numpy数组是一种特殊的数据结构。
这意味着你不仅能享受到高效的内存使用,还能得到一些专门优化过的功能。
比如,当你要把两个数组相加时,计算机会使用专门的CPU向量运算来完成,而不是像普通的Python代码那样在循环中逐个加起来。
131
Numpy数组是紧凑的、类型相同的数组。而Python的列表则是指向对象的指针数组,即使它们的类型都是一样的。所以,使用Numpy可以更好地利用数据的“局部性”。
另外,很多Numpy的操作都是用C语言实现的,这样可以避免Python中循环的开销、指针的间接引用和每个元素的动态类型检查。速度提升的程度取决于你进行的操作,但在处理大量数据的程序中,速度提升几倍甚至几十倍都是很常见的。