相对于常规的Python列表,NumPy有什么优势?

2024-04-25 11:32:48 发布

您现在位置:Python中文网/ 问答频道 /正文

与常规Python列表相比,NumPy有什么优势?

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

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

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

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


Tags: numpy列表标准错误原因矩阵数组性能
3条回答

亚历克斯提到了内存效率,罗伯托提到了便利性,这些都是优点。关于更多的想法,我将提到速度功能

功能性:你可以使用NumPy、FFTs、卷积、快速搜索、基本统计、线性代数、直方图等功能,真的,没有FFTs谁能活下来?

Speed:这里有一个关于对列表和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

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

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

也许你不太关心一百万个单元,但你肯定会关心十亿个单元——这两种方法都不适合32位体系结构,但是对于64位的构建,NumPy可以摆脱4gb左右,仅Python就需要至少12gb(很多指针的大小是原来的两倍)——一个更昂贵的硬件!

区别主要是由于“间接性”——Python列表是指向Python对象的指针数组,每个指针至少4个字节,再加上最小Python对象的16个字节(类型指针4个,引用计数4个,值4个——内存分配程序最多16个)。NumPy数组是一个统一值的数组——单精度数字每个4字节,双精度数字每个8字节。灵活性较低,但您要为标准Python列表的灵活性付出很大代价!

相关问题 更多 >