为什么NumPy数组这么快?

91 投票
6 回答
61683 浏览
提问于 2025-04-17 07:44

我刚刚把我写的一个程序改成用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中循环的开销、指针的间接引用和每个元素的动态类型检查。速度提升的程度取决于你进行的操作,但在处理大量数据的程序中,速度提升几倍甚至几十倍都是很常见的。

撰写回答