3 回答
TA贡献1784条经验 获得超7个赞
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列表的灵活性付出高昂的代价!
TA贡献1775条经验 获得超11个赞
Andarray将其数据存储在连续的数据缓冲区中
例如,在我当前的ipython会话中:
In [63]: x.shape
Out[63]: (35, 7)
In [64]: x.dtype
Out[64]: dtype('int64')
In [65]: x.size
Out[65]: 245
In [66]: x.itemsize
Out[66]: 8
In [67]: x.nbytes
Out[67]: 1960
被引用的数组x具有一个内存块,其信息类似于shape和strides,并且此数据缓冲区占用1960字节。
识别列表的内存使用情况例如xl = x.tolist()比较棘手。 len(xl)是35,也就是说,它的数据缓冲区有35个指针。但是每个指针都引用7个元素的不同列表。这些列表中的每一个都有指向数字的指针。在我的示例中,数字都是小于255的整数,因此每个数字都是唯一的(重复指向同一对象)。对于较大的整数和浮点数,每个整数都有一个单独的Python对象。因此,列表的内存占用量取决于嵌套的程度以及各个元素的类型。
ndarray也可以具有objectdtype,在这种情况下,它也包含指向内存中其他位置的对象的指针。
还有另一个细微差别-列表的主指针缓冲区的大小略大,以使其append更快。
添加回答
举报