529

与常规 Python 列表相比, NumPy有哪些优势?

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

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

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

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

4

7 回答 7

793

NumPy 的数组比 Python 列表更紧凑——您描述的列表列表在 Python 中至少需要 20 MB 左右,而单元格中具有单精度浮点数的 NumPy 3D 数组将适合 4 MB。使用 NumPy 读取和写入项目的访问也更快。

也许你对一百万个单元不太在意,但你肯定会关心十亿个单元——这两种方法都不适合 32 位架构,但是对于 64 位构建,NumPy 会得到 4 GB 左右, 单独的 Python 至少需要大约 12 GB(大量指针大小翻倍)——这是一个更昂贵的硬件!

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

于 2009-06-14T23:16:23.590 回答
256

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 也是值得的。

于 2009-06-14T23:38:50.870 回答
120

Alex 提到了内存效率,Roberto 提到了便利性,这些都是优点。对于更多的想法,我会提到速度功能

功能: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
于 2009-06-15T04:59:38.843 回答
48

这是scipy.org 网站上常见问题解答的一个很好的答案:

NumPy 数组相对于(嵌套的)Python 列表有哪些优势?

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

于 2014-09-11T02:35:09.107 回答
15

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

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

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

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

于 2019-02-05T12:46:45.123 回答
0
  • NumPy 不是另一种编程语言,而是 Python 扩展模块。它提供对同类数据数组的快速高效的操作。Numpy 具有固定的创建大小。
  • 在 Python 中:列表是用方括号写的。这些列表可以是同质的或异质的
  • 在 Python 列表中使用 Numpy 数组的主要优点:
    1. 它消耗更少的内存。
    2. 与 python 列表相比快。
    3. 使用方便。
于 2021-10-22T17:55:39.523 回答
0

Python 中标准的可变多元素容器是列表。由于 Python 的动态类型,我们甚至可以创建异构列表。为了允许这些灵活的类型,列表中的每个项目都必须包含自己的类型信息、引用计数和其他信息。也就是说,每一项都是一个完整的 Python 对象。在所有变量都属于同一类型的特殊情况下,大部分信息都是多余的;将数据存储在固定类型的数组(NumPy 风格)中会更有效率。固定类型的 NumPy 样式数组缺乏这种灵活性,但在存储和操作数据方面效率更高。

于 2022-02-25T02:40:03.473 回答