Numpy可以提高数组重复计算的速度

Numpy可以提高数组重复计算的速度

Numpy数组的运算速度要比python数组的运算的快很多,其关键是利用向量化操作,通常这在Numpy的通用函数(ufun)中实现。

我们先看看python原生实现对一个数组所有元素取倒数操作的时间效率。这里使用Ipython的魔术方法%timit计算该操作运行的时间:

In [1]:
import numpy as np
np.random.seed(0)

def compute_reciprocals(values):
    output = np.empty(len(values))
    for i in range(len(values)):
        output[i] = 1.0 / values[i]
    return output

big_array = np.random.randint(1, 100, size=10 ** 6)
%timeit compute_reciprocals(big_array)

Out[1]:
1.46 s ± 9.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

以上这种实现方式对于有C语言和Java背景的人来说非常自然,但在python中,这一操作就相当耗时,仅仅是完成百万次上述操作并存储结果花了几秒钟的时间。事实上,这里的运算瓶颈并不是运算本身,而是Cpython在每次循环时必须做数据类型的检查和函数的调度。每次进行倒数运算时,python首先检查对象的类型,并且动态查找可以使用该数据类型的正确函数。如果我们在编译代码时进行这样的操作,那么就能在代码执行之前知晓类型的声明,结果的计算也会更加有效率。

numpy的解决方法

Numpy为很多类型的操作提供了非常方便的、静态类型的、可编译程序的借口,也被称作向量操作,这种向量方法将循环推送至Numpy之下的编译层,从而取得更快的执行效率。因此,当你看到python脚本的出现复杂度很高的循环时,就应该考虑能否用向量方式替换这个循环。

In[2]:%timeit (1.0 / big_array)

Out[2]:
1.46 ms ± 30 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

可以看到,使用向量操作后,对于相同的操作,numpy下运行速度要比python原生方法提升1000倍!

猜你喜欢

转载自blog.csdn.net/jasonzhoujx/article/details/81603641