NumPy是Numerical Python的缩写,是Python中用于数值计算的最重要的基础包之一。 大多数提供科学功能的计算包使用NumPy的数组对象作为数据交换的通用语。
以下是NumPy的一些特性:
- ndarray是一种高效的多维阵列,提供快速的面向矩阵的算术操作和灵活的广播能力。
- 数学函数可在整个数据阵列上进行快速操作,无需编写循环。
- 用于将阵列数据 读/写 到磁盘并使用内存映射文件的工具。
- 具备线性代数,随机数生成和傅里叶变换功能。
- 用于连接NumPy与用C,C ++或FORTRAN编写的库的C语言API。
NumPy对于Python中的数值计算非常重要的原因之一是因为它旨在提高大型数据阵列的效率。 具体有:
- NumPy内部将数据存储在连续的内存块中,与其他内置Python对象无关。 用C语言编写的NumPy的算法库可以在这种内存上运行,不需要任何类型检查或其他开销。 NumPy数组使用的内存也比内置Python序列少得多。
- NumPy操作对整个数组执行复杂的计算,而不需要Python for循环。
为了让读者对性能差异有所了解,考虑包含一百万个整数的NumPy数组以及同等的Python列表:
In [4]: import numpy as np
In [5]: my_arr = np.arange(1000000)
In [6]: my_list = list(range(1000000))
然后将序列都乘以2:
In [7]: %time for _ in range(10): my_arr2 = my_arr * 2
CPU times: user 12.8 ms, sys: 6.24 ms, total: 19 ms
Wall time: 19.5 ms
In [8]: %time for _ in range(10): my_list2 = [x * 2 for x in my_list]
CPU times: user 662 ms, sys: 153 ms, total: 815 ms
Wall time: 813 ms
(以上时间为笔者自己电脑跑出来结果,macOS系统)
基于NumPy的算法通常比相对应的纯Python算法快10到100倍(或更多),并且使用的内存要少得多。