NumPy优于常规Python列表有什么优势?

时间:2009-06-14 23:02:14

标签: python arrays list numpy numpy-ndarray

NumPy相对于常规Python列表有什么好处?

我有大约100个金融市场系列,我将创建一个100x100x100 = 100万个单元格的立方体阵列。我将使用每个y和z对每个x进行回归(3变量),以便用标准错误填充数组。

我听说过对于“大型矩阵”,出于性能和可伸缩性的原因,我应该使用NumPy而不是Python列表。事实是,我知道Python列表,它们似乎对我有用。

如果我搬到NumPy会有什么好处?

如果我有1000个系列(即立方体中有10亿个浮点单元)怎么办?

7 个答案:

答案 0 :(得分:671)

NumPy的数组比Python列表更紧凑 - 如你所描述的列表列表,在Python中,至少需要20 MB左右,而单元格中具有单精度浮点数的NumPy 3D数组将适合4 MB。 NumPy可以更快地访问读写项目。

也许你对这一百万个单元并不那么关心,但你绝对会选择十亿个单元 - 这两种方法都不适合32位架构,但是对于64位构建,NumPy可以获得4个单元GB左右,仅Python需要至少大约12 GB(大量指针大小翻倍) - 一个更昂贵的硬件!

差异主要是由于“间接性” - Python列表是指向Python对象的指针数组,每个指针至少4个字节加上16个字节,即使是最小的Python对象(4个用于类型指针,4个用于参考) count,4表示值 - 内存分配器最多为16。 NumPy数组是一个统一值的数组 - 单精度数字各占4个字节,双精度数字,8个字节。不太灵活,但您为标准Python列表的灵活性付出了大笔代价!

答案 1 :(得分:218)

NumPy不仅效率更高;它也更方便。你可以免费获得大量的向量和矩阵运算,这有时可以避免不必要的工作。而且它们也得到了有效的实施。

例如,您可以直接从文件中将多维数据集读取到数组中:

x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))

沿第二个维度求和:

s = x.sum(axis=1)

查找哪些单元格高于阈值:

(x > 0.5).nonzero()

沿第三维删除每个偶数索引切片:

x[:, :, ::2]

此外,许多有用的库可以与NumPy数组一起使用。例如,统计分析和可视化库。

即使您没有性能问题,学习NumPy也是值得的。

答案 2 :(得分:104)

亚历克斯提到了记忆效率,罗伯托提到了方便,这些都是好点。对于更多想法,我会提到速度功能

功能:你可以使用NumPy,FFT,卷积,快速搜索,基本统计,线性代数,直方图等内置很多内容。真的,谁可以在没有FFT的情况下生活?

速度:这是对列表和NumPy数组进行求和的测试,显示NumPy数组上的总和快10倍(在此测试中 - 里程可能会有所不同)。

from numpy import arange
from timeit import Timer

Nelements = 10000
Ntimeits = 10000

x = arange(Nelements)
y = range(Nelements)

t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list:  %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))

在我的系统上(当我正在运行备份时)给出:

numpy: 3.004e-05
list:  5.363e-04

答案 3 :(得分:39)

以下是scipy.org website的常见问题解答中的一个很好的答案:

NumPy阵列对(嵌套)Python列表有何优势?

  

Python的列表是高效的通用容器。他们支持   (相当)有效的插入,删除,追加和连接,   和Python的列表推导使它们易于构造和   操纵。但是,它们有一定的局限性:它们不支持   “矢量化”操作,如元素加法和乘法,   以及它们可以包含不同类型的对象的事实意味着   Python必须存储每个元素的类型信息,并且必须   在对每个元素进行操作时执行类型调度代码。这个   也意味着很少有列表操作可以执行   高效的C循环 - 每次迭代都需要进行类型检查等   Python API簿记。

答案 4 :(得分:16)

另请注意,时间序列scikits中支持基于NumPy的时间序列:

http://pytseries.sourceforge.net

对于回归,我很确定即使对于100 ^ 3问题,NumPy也会比列表更快,更方便。

答案 5 :(得分:3)

所有人都强调了numpy数组和python列表之间几乎所有的主要区别,我将在这里简单介绍一下:

  1. Numpy数组在创建时具有固定的大小,这与python列表(可以动态增长)不同。更改ndarray的大小将创建一个新数组并删除原始数组。

  2. Numpy数组中的所有元素都必须具有相同的数据类型(我们也可以具有异构类型,但不允许您进行数学运算),因此在内存中的大小将相同

  3. Numpy数组有助于对大量数据进行数学运算和其他类型的运算。通常,与使用python顺序构建相比,此类操作执行效率更高且代码更少。

答案 6 :(得分:-4)

Numpy提供了许多非常强大的数学工具,可用于numpy数组或矩阵。由于numpy进行了很好的优化,并且使用C语言编写,因此与使用python编写代码相比,它的运行速度要快得多。更不用说自己编写所有功能会很麻烦。